This is Kara’s first pass at analyzing the Spiritual Epidemiology data (with data from 2019-03-08). (Note: PDF printed portrait, 90% zoom, default margins.)
Porosity
For Spiritual Epidemiology, the Porosity scale consisted of 16 basic items, and follow-up questions to a subset of these items. For each of the basic items, participants could respond by saying “it does not happen” (scored as 0), “it might happen” (scored as 0.5), or “it definitely happens” (scored as 1).
Overall scores
First, I’ll examine overall “scores” on this scale, taking into account only the basic items (not the follow-up questions). Scores could range from 0 (equivalent to saying “it does not happen” for all 16 items) to 16 (equivalent to saying “it definitely happens” for all 16 items).

From these plots, it is clear that while there was substantial variability across individuals within each site, participants’ average response also varied fairly dramatically across sites, with participants in China endorsing the fewest items, participants in the US and Thailand endorsing slightly more, and participants in Ghana and Vanuatu endorsing the most.
Comparing porosity scores across sites [model: lm(score ~ epi_ctry, d_por_scored)]
| parameter |
b |
standard error |
t |
p |
significant |
| (Intercept) |
6.83 |
0.10 |
71.29 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.55 |
0.05 |
12.06 |
<0.001 |
* |
| epi_ctryGHVT_THCH |
4.13 |
0.11 |
38.00 |
<0.001 |
* |
| epi_ctryGH_VT |
0.04 |
0.15 |
0.31 |
0.76 |
|
| epi_ctryTH_CH |
0.91 |
0.16 |
5.68 |
<0.001 |
* |
Comparing porosity responses across sites [model: lmer(response ~ epi_ctry + (1 | epi_subj) + (epi_ctry | question)]
| parameter |
b |
standard error |
df |
t |
p |
significant |
| (Intercept) |
0.57 |
0.04 |
21.27 |
15.68 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.06 |
0.01 |
26.30 |
6.67 |
<0.001 |
* |
| epi_ctryGHVT_THCH |
0.37 |
0.04 |
24.87 |
10.32 |
<0.001 |
* |
| epi_ctryGH_VT |
-0.09 |
0.03 |
30.97 |
-3.11 |
0.004 |
* |
| epi_ctryTH_CH |
0.08 |
0.02 |
199.27 |
5.19 |
<0.001 |
* |
I ran two kinds of statistical analyses of these results: One comparing these average scores across sites (top table), and the other taking into account variability across individual participants and across individual items in the scale (bottom table). Theoretically, these analyses should yield pretty similar results, so I would be especially confident in effects that are consistent across the two analyses and that seem obvious from the plots.
Both analyses suggest that participants in sites outside of the US generally had significantly higher Porosity scores than participants in the US (see “epi_ctrynonUS_US” rows)—but looking at the plots it is clear that this was driven by participants in Ghana and Vanuatu, and was not true, on average, among participants in Thailand or China. In line with this, both analyses suggest that participants in Ghana and Vanuatu had significantly higher Porosity scores than participants in Thailand and China—and that this difference was far greater than the difference between “the West vs. the rest” (see “epi_ctrynonUS_US” rows). Both analyses also suggest that participants in Thailand had significantly higher Porosity scores, on average, than participants in China (see “epi_ctryTH_CH” rows).
By item
Next, I’ll examine responses to individual items on the Porosity scale, first focusing on the basic items and then turning to the follow-up questions and a few site-specific questions. For each item, participants could say “it does not happen” (scored as 0), “it might happen” (scored as 0.5), or “it definitely happens” (scored as 1).

There is so much to unpack here! When I look at these items, a few things that I think about are:
- Which items tend to follow the overall pattern established by the “overall scores” presented in the previous section? (e.g., question #1, many others)
- Among items that follow the overall pattern, for which items is this pattern exaggerated? (e.g., questions #5, #12) For which items is this pattern attentuated? (e.g., quesitons #2, #3)
- Which items do not follow this overall trend? (e.g., question #16)
- Which items seem to pick out an experience that is uniquely salient/prevalent in a particular site? (e.g., questions #7, #16)
Note that I just picked out a few examples to illustrate what I mean, but there are certainly other interesting cases that might be worth thinking about more deeply - e.g., question #15, where US participants appear more like Ghanaian & ni-Van participants than Thai or Chinese participants).
Here are participants’ answers to the follow-up questions for a subset of those basic items:

And here are participants’ answers to a few site-specific questions:

Prayer (spiritual experience Question #1)
For Spiritual Epidemiology, the “spiritual experience” portion of the epidemiology began with two questions intended to gauge participants’ prayer practice. Here are participants’ responses to these two questions:

All spiritual experiences (Questions #2-23)
For Spiritual Epidemiology, the Spiritual Experiences scale consisted of 22 basic items (34 basic items in Thailand), and follow-up questions to a subset of these items. For each of the basic items, participants could respond by saying “no” (scored as 0), “maybe” (scored as 0.5; this might have only been available in some sites?), or “yes” (scored as 1).
Note: In addition to these 22 items, there were two items included as part of this section on “spiritual experiences” that were intended to gauge participants’ prayer practice - see Prayer (spiritual experience Question #1), above.
Overall scores
First, I’ll examine overall “scores” on this scale, taking into account only the basic items (not the follow-up questions).
In Thailand, there were an additional 12 quesitons (about experiences of additional “beings”) that; I have treated this discrepancy across sites in two different ways below: (1) Consdering all beings and using proportions, rather than sums, as “scores” (equivalent to asking, for each particiant, what proportion of the items they were exposed to did they endorse?); and (2) Considering only the first 5 beings asked about in each site, such that all participants were asked the same number of questions.
Considering all “beings”
Using the first approach (considering all “beings,” with 12 more beings in Thailand than in any other site), scores could range from 0 (equivalent to saying “no” for all 22-34 items) to 1 (equivalent to saying “yes” for all 22-34 items).

From these plots, it is clear that while there was substantial variability across individuals within each site, participants’ average response also varied fairly dramatically across sites, with participants in China endorsing the fewest items, participants in the US and Thailand endorsing slightly more, and participants in Ghana and Vanuatu endorsing the most. This is the same pattern we observed for Porosity scores, above.
Comparing spiritual experience scores across sites [model: lm(score ~ epi_ctry, d_spex_base_q2to23_scored_propall)]
| parameter |
b |
standard error |
t |
p |
significant |
| (Intercept) |
0.28 |
0.01 |
50.72 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.01 |
0.00 |
3.72 |
<0.001 |
* |
| epi_ctryGHVT_THCH |
0.10 |
0.01 |
15.72 |
<0.001 |
* |
| epi_ctryGH_VT |
-0.04 |
0.01 |
-4.57 |
<0.001 |
* |
| epi_ctryTH_CH |
0.07 |
0.01 |
7.77 |
<0.001 |
* |
Comparing spiritual experience responses across sites [model: lmer(response ~ epi_ctry + (1 | epi_subj) + (epi_ctry | question), d_spex_base_q2to23)]
| parameter |
b |
standard error |
df |
t |
p |
significant |
| (Intercept) |
0.24 |
0.02 |
49.88 |
9.83 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.00 |
0.01 |
34.43 |
0.75 |
0.461 |
|
| epi_ctryGHVT_THCH |
0.10 |
0.02 |
32.57 |
5.60 |
<0.001 |
* |
| epi_ctryGH_VT |
-0.05 |
0.03 |
29.37 |
-1.91 |
0.067 |
|
| epi_ctryTH_CH |
0.06 |
0.02 |
39.19 |
3.06 |
0.004 |
* |
Again, I ran two kinds of statistical analyses of these results: One comparing these scores across sites (top table), and the other taking into account variability across individual participants and across individual items in the scale (bottom table). Theoretically, these analyses should yield pretty similar results, so I would be especially confident in effects that are consistent across the two analyses and that seem obvious from the plots.
Both analyses suggest that participants in sites outside of the US generally had significantly higher Porosity scores than participants in Ghana and Vanuatu had significantly higher Porosity scores than participants in Thailand and China (see “epi_ctrynonUS_US” rows), and that participants in Thailand had significantly higher Porosity scores, on average, than participants in China (see “epi_ctryTH_CH” rows).
Considering first five “beings” only
Using the second approach (considering only the first five “beings” in each site), scores could range from 0 (equivalent to saying “no” for all 22 items) to 22 (equivalent to saying “yes” for all 22 items).

These plots look very similar to the plots considering all beings (which I find reassuring).
Comparing spiritual experience scores across sites [model: lm(score ~ epi_ctry, d_spex_base_q2to23_scored_first5)]
| parameter |
b |
standard error |
t |
p |
significant |
| (Intercept) |
6.19 |
0.12 |
50.60 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.23 |
0.06 |
3.86 |
<0.001 |
* |
| epi_ctryGHVT_THCH |
2.08 |
0.14 |
14.97 |
<0.001 |
* |
| epi_ctryGH_VT |
-0.90 |
0.19 |
-4.82 |
<0.001 |
* |
| epi_ctryTH_CH |
1.73 |
0.20 |
8.45 |
<0.001 |
* |
This pattern of results are identical to the pattern of results considering all beings (which, again, I find reassuring).
In the following four sections (Spiritual experiences: Universal questions, set 1 (Questions #2-10), Spiritual experiences: Beings questions (Questions #11-15 + more for Thailand), Spiritual experiences: Universal questions, set 2 (Questions #16-21), and Spiritual experiences: Universal questions, set 3 (Questions #22-23)), I look at scores for sub-sections of the Spiritual Experience scale, and at responses to individual items in this scale, including follow-up items. I do not provide text commentary on these additional plots and analyses at this time, but they all follow the same logic as the plots and analyses that I have annotated above.
Spiritual experiences: Universal questions, set 1 (Questions #2-10)
Overall scores

By item

Spiritual experiences: Beings questions (Questions #11-15 + more for Thailand)
Overall scores
Considering all “beings” (more for Thailand)
Removed 1 rows containing missing values (geom_point).

Considering first five “beings” only

By item

Spiritual experiences: Universal questions, set 2 (Questions #16-21)
Overall scores

By item

Spiritual experiences: Universal questions, set 3 (Questions #22-23)
Overall scores

By item

Relationships between porosity and spiritual experience
Finally, I will consider the relationship between Porosity scores and Spiritual Experience scores, comparing this relationship across sites and examining this relationship within each site indivdidually. Again, I will explore two ways of handling the discrepancy between questions asked in Thailand vs. other sites.
Considering all “beings” (more for Thailand)

From the plot, it is clear that there is a general relationship between Porosity and Spiritual Experience scores. The strength of this relationships appears to vary somewhat across sites, but visual inspection suggests that this relationship is present to some degree in each site individually.
First, I’ll look at this relationship considering all sites in the same analysis (standardizing scores collapsing across all sites, to maintain the pattern fo general differences in Porosity and Spiritual Experience across sites):
Relationship between porosity and spiritual experience, comparing across sites [model: lm(por_score_std_collapse ~ spex_score_propall_std_collapse * epi_ctry, d_por_spex_base_q2to23_propall)]
| parameter |
b |
standard error |
t |
p |
significant |
| (Intercept) |
0.03 |
0.02 |
1.44 |
0.151 |
|
| spex_score_propall_std_collapse |
0.40 |
0.02 |
18.98 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.10 |
0.01 |
12.14 |
<0.001 |
* |
| epi_ctryGHVT_THCH |
0.64 |
0.02 |
27.04 |
<0.001 |
* |
| epi_ctryGH_VT |
0.08 |
0.03 |
2.93 |
0.003 |
* |
| epi_ctryTH_CH |
-0.04 |
0.04 |
-0.95 |
0.344 |
|
| spex_score_propall_std_collapse:epi_ctrynonUS_US |
-0.03 |
0.01 |
-2.85 |
0.005 |
* |
| spex_score_propall_std_collapse:epi_ctryGHVT_THCH |
-0.15 |
0.02 |
-6.20 |
<0.001 |
* |
| spex_score_propall_std_collapse:epi_ctryGH_VT |
-0.06 |
0.03 |
-2.51 |
0.012 |
* |
| spex_score_propall_std_collapse:epi_ctryTH_CH |
-0.07 |
0.04 |
-1.74 |
0.083 |
|
Including all of the data in a single analysis suggests that, collapsing across sites, the relationship between Porosity and Spiritual Experience scores is significantly positive (see “spex_score_propall_std” row in the table above). However, this relationship appears to be significantly weaker among participants outside of the US than it is among US participants (see “spex_score_propall_std:epi_ctrynonUS_US” row), significantly weaker among participants in Ghana and Vanuatu relative to participants in Thailand and China (see “spex_score_propall_std:epi_ctryGHVT_THCH” row), and significantly weaker among participants in Ghana relative to participants in Vanuatu (see “spex_score_propall_std:epi_ctryGH_VT” row). In other words, the relationship between Porosity and Spiritual Experience seems to have been strongest in the US and Chinese samples, weaker in the ni-Van and Thai samples, and weakest in the Ghanaian sample. (This is true even after accounting for overall differences in porosity and spiritual experience across sites.)

Next, I’ll look at this relationship considering each sites individually in its own analysis (standardizing scores within each site):
Relationship between porosity and spiritual experience, within each site separately [model: lm(por_score_std ~ spex_score_propall_std, d_por_spex_base_q2to23_propall %>% filter(epi_ctry == ...)]
| parameter |
b |
standard error |
t |
p |
significant |
| US |
| (Intercept) |
0.00 |
0.05 |
0.00 |
1 |
|
| spex_score_propall_std |
0.63 |
0.05 |
12.03 |
<0.001 |
* |
| Ghana |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_propall_std |
0.29 |
0.06 |
4.75 |
<0.001 |
* |
| Thailand |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_propall_std |
0.46 |
0.06 |
7.35 |
<0.001 |
* |
| China |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_propall_std |
0.69 |
0.06 |
12.03 |
<0.001 |
* |
| Vanuatu |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_propall_std |
0.49 |
0.06 |
7.79 |
<0.001 |
* |
This analysis suggests that the relationship between Porosity and Spiritual Experience is signficantly positive in all five sites considered individually. The regression coefficients (“b” column in the table above) further confirm that the strength of this relationhip varied across sites: It was strongest in China and the US, middling in Vanuatu and Thailand, and weakest (but still significantly positive) in Ghana.
Considering first five “beings” for all sites

Again, it is clear from the plot that there is a general relationship between Porosity and Spiritual Experience scores, and the strength of this relationships appears to vary somewhat across sites.
First, I’ll look at this relationship considering all sites in the same analysis (standardizing scores collapsing across all sites, to maintain the pattern fo general differences in Porosity and Spiritual Experience across sites):
Relationship between porosity and spiritual experience, comparing across sites [model: lm(por_score_std_collapse ~ spex_score_first5_std_collapse * epi_ctry, d_por_spex_base_q2to23_first5)]
| parameter |
b |
standard error |
t |
p |
significant |
| (Intercept) |
0.03 |
0.02 |
1.35 |
0.178 |
|
| spex_score_first5_std_collapse |
0.39 |
0.02 |
18.87 |
<0.001 |
* |
| epi_ctrynonUS_US |
0.10 |
0.01 |
11.92 |
<0.001 |
* |
| epi_ctryGHVT_THCH |
0.65 |
0.02 |
27.01 |
<0.001 |
* |
| epi_ctryGH_VT |
0.08 |
0.03 |
2.96 |
0.003 |
* |
| epi_ctryTH_CH |
-0.06 |
0.04 |
-1.51 |
0.131 |
|
| spex_score_first5_std_collapse:epi_ctrynonUS_US |
-0.03 |
0.01 |
-3.06 |
0.002 |
* |
| spex_score_first5_std_collapse:epi_ctryGHVT_THCH |
-0.14 |
0.02 |
-5.67 |
<0.001 |
* |
| spex_score_first5_std_collapse:epi_ctryGH_VT |
-0.06 |
0.03 |
-2.33 |
0.02 |
* |
| spex_score_first5_std_collapse:epi_ctryTH_CH |
-0.11 |
0.04 |
-2.73 |
0.007 |
* |
This analysis is virtually identical to the parallel analysis using proportion scores, above—with the additional suggestion that the relationship was significantly weaker among participants in Thailand than participants in China (see “spex_score_first5_std:epi_ctryTH_CH” row in table above).

Next, I’ll look at this relationship considering each sites individually in its own analysis (standardizing scores within each site):
Relationship between porosity and spiritual experience, within each site separately [model: lm(por_score_std ~ spex_score_first5_std, d_por_spex_base_q2to23_first5 %>% filter(epi_ctry == ...)]
| parameter |
b |
standard error |
t |
p |
significant |
| US |
| (Intercept) |
0.00 |
0.05 |
0.00 |
1 |
|
| spex_score_first5_std |
0.62 |
0.05 |
11.91 |
<0.001 |
* |
| Ghana |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_first5_std |
0.30 |
0.06 |
4.88 |
<0.001 |
* |
| Thailand |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_first5_std |
0.44 |
0.06 |
7.02 |
<0.001 |
* |
| China |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_first5_std |
0.69 |
0.06 |
12.02 |
<0.001 |
* |
| Vanuatu |
| (Intercept) |
0.00 |
0.06 |
0.00 |
1 |
|
| spex_score_first5_std |
0.49 |
0.06 |
7.85 |
<0.001 |
* |
As with the analysis of proportion scores, this analysis suggests that the relationship between Porosity and Spiritual Experience is signficantly positive in all five sites considered individually, and the regression coefficients (“b” column in the table above) further confirm that this relationhip was strongest in China and the US, middling in Vanuatu and Thailand, and weakest (but still significantly positive) in Ghana.
LS0tCnRpdGxlOiAiU3Bpcml0dWFsIGVwaWRlbWlvbG9neSBBTkFMWVNJUyAoS1cgZmlyc3QgcGFzcykiCnN1YnRpdGxlOiAiTGFzdCB1cGRhdGVkOiAyMDE5LTA0LTE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpUaGlzIGlzIEthcmEncyBmaXJzdCBwYXNzIGF0IGFuYWx5emluZyB0aGUgU3Bpcml0dWFsIEVwaWRlbWlvbG9neSBkYXRhICh3aXRoIGRhdGEgZnJvbSAyMDE5LTAzLTA4KS4gKE5vdGU6IFBERiBwcmludGVkIHBvcnRyYWl0LCA5MCUgem9vbSwgZGVmYXVsdCBtYXJnaW5zLikKCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjY3LAogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IEYsIGVjaG8gPSBGKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobG1lclRlc3QpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShsdWJyaWRhdGUpCgp0aGVtZV9zZXQodGhlbWVfYncoKSkKYGBgCgoKYGBge3J9CmRfcG9yIDwtIHJlYWQuY3N2KCIuL2RhdGFfd3JhbmdsZWQvZF9wb3IuY3N2Iiwgcm93Lm5hbWVzID0gIlgiKSAlPiUKICBtdXRhdGUoZXBpX2N0cnkgPSBmYWN0b3IoZXBpX2N0cnksIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKQoKZF9wb3Jfc2NvcmVkIDwtIHJlYWQuY3N2KCIuL2RhdGFfd3JhbmdsZWQvZF9wb3Jfc2NvcmVkLmNzdiIsIHJvdy5uYW1lcyA9ICJYIikgJT4lCiAgbXV0YXRlKGVwaV9jdHJ5ID0gZmFjdG9yKGVwaV9jdHJ5LCBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkKYGBgCgpgYGB7cn0KZF9wcmF5ZXIgPC0gcmVhZC5jc3YoIi4vZGF0YV93cmFuZ2xlZC9kX3ByYXllci5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCmBgYAoKYGBge3J9CmRfc3BleF9iYXNlX3EydG8yMyA8LSByZWFkLmNzdigiLi9kYXRhX3dyYW5nbGVkL2Rfc3BleF9iYXNlX3EydG8yMy5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCgpkX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX3Byb3BhbGwgPC0gcmVhZC5jc3YoIi4vZGF0YV93cmFuZ2xlZC9kX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX3Byb3BhbGwuY3N2Iiwgcm93Lm5hbWVzID0gIlgiKSAlPiUKICBtdXRhdGUoZXBpX2N0cnkgPSBmYWN0b3IoZXBpX2N0cnksIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKQoKZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9maXJzdDUgPC0gcmVhZC5jc3YoIi4vZGF0YV93cmFuZ2xlZC9kX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX2ZpcnN0NS5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCmBgYAoKYGBge3J9CmRfc3BleF9iYXNlX3EydG8xMCA8LSByZWFkLmNzdigiLi9kYXRhX3dyYW5nbGVkL2Rfc3BleF9iYXNlX3EydG8xMC5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCgpkX3NwZXhfYmFzZV9xMnRvMTBfc2NvcmVkIDwtIHJlYWQuY3N2KCIuL2RhdGFfd3JhbmdsZWQvZF9zcGV4X2Jhc2VfcTJ0bzEwX3Njb3JlZC5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCmBgYAoKYGBge3J9CmRfc3BleF9iYXNlX3ExMXRvMTUgPC0gcmVhZC5jc3YoImRhdGFfd3JhbmdsZWQvZF9zcGV4X2Jhc2VfcTExdG8xNS5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCgpkX3NwZXhfYmFzZV9xMTF0bzE1X3Njb3JlZCA8LSByZWFkLmNzdigiZGF0YV93cmFuZ2xlZC9kX3NwZXhfYmFzZV9xMTF0bzE1X3Njb3JlZC5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCmBgYAoKYGBge3J9CmRfc3BleF9iYXNlX3ExNnRvMjEgPC0gcmVhZC5jc3YoImRhdGFfd3JhbmdsZWQvZF9zcGV4X2Jhc2VfcTE2dG8yMS5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCgpkX3NwZXhfYmFzZV9xMTZ0bzIxX3Njb3JlZCA8LSByZWFkLmNzdigiZGF0YV93cmFuZ2xlZC9kX3NwZXhfYmFzZV9xMTZ0bzIxX3Njb3JlZC5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCmBgYAoKYGBge3J9CmRfc3BleF9iYXNlX3EyMnRvMjMgPC0gcmVhZC5jc3YoImRhdGFfd3JhbmdsZWQvZF9zcGV4X2Jhc2VfcTIydG8yMy5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCgpkX3NwZXhfYmFzZV9xMjJ0bzIzX3Njb3JlZCA8LSByZWFkLmNzdigiZGF0YV93cmFuZ2xlZC9kX3NwZXhfYmFzZV9xMjJ0bzIzX3Njb3JlZC5jc3YiLCByb3cubmFtZXMgPSAiWCIpICU+JQogIG11dGF0ZShlcGlfY3RyeSA9IGZhY3RvcihlcGlfY3RyeSwgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpCmBgYAoKYGBge3J9CiMgYWx0ZXJuYXRpdmUgY29udHJhc3RzIGZvciBzaXRlCmNvbnRyYXN0c19jdHJ5X2VmZiA8LSBjYmluZCgiVVMiID0gYygxLCAwLCAwLCAwLCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0giID0gYygwLCAxLCAwLCAwLCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiID0gYygwLCAwLCAxLCAwLCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0giID0gYygwLCAwLCAwLCAxLCAtMSkpCgpjb250cmFzdHNfY3RyeV9kdW0gPC0gY2JpbmQoIkdIX1VTIiA9IGMoMCwgMSwgMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhfVVMiID0gYygwLCAwLCAxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSF9VUyIgPSBjKDAsIDAsIDAsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZUX1VTIiA9IGMoMCwgMCwgMCwgMCwgMSkpCgpjb250cmFzdHNfY3RyeV9jdHIgPC0gY2JpbmQoIm5vblVTX1VTIiA9IGMoLTQsIDEsIDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdIVlRfVEhDSCIgPSBjKDAsIDEsIC0xLCAtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0hfVlQiID0gYygwLCAxLCAwLCAwLCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhfQ0giID0gYygwLCAwLCAxLCAtMSwgMCkpCmBgYAoKIyBQb3Jvc2l0eQoKRm9yIFNwaXJpdHVhbCBFcGlkZW1pb2xvZ3ksIHRoZSBQb3Jvc2l0eSBzY2FsZSBjb25zaXN0ZWQgb2YgMTYgYmFzaWMgaXRlbXMsIGFuZCBmb2xsb3ctdXAgcXVlc3Rpb25zIHRvIGEgc3Vic2V0IG9mIHRoZXNlIGl0ZW1zLiBGb3IgZWFjaCBvZiB0aGUgYmFzaWMgaXRlbXMsIHBhcnRpY2lwYW50cyBjb3VsZCByZXNwb25kIGJ5IHNheWluZyAiaXQgZG9lcyBub3QgaGFwcGVuIiAoc2NvcmVkIGFzIDApLCAiaXQgbWlnaHQgaGFwcGVuIiAoc2NvcmVkIGFzIDAuNSksIG9yICJpdCBkZWZpbml0ZWx5IGhhcHBlbnMiIChzY29yZWQgYXMgMSkuCgojIyBPdmVyYWxsIHNjb3JlcwoKRmlyc3QsIEknbGwgZXhhbWluZSBvdmVyYWxsICJzY29yZXMiIG9uIHRoaXMgc2NhbGUsIHRha2luZyBpbnRvIGFjY291bnQgb25seSB0aGUgYmFzaWMgaXRlbXMgKG5vdCB0aGUgZm9sbG93LXVwIHF1ZXN0aW9ucykuIFNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAgKGVxdWl2YWxlbnQgdG8gc2F5aW5nICJpdCBkb2VzIG5vdCBoYXBwZW4iIGZvciBhbGwgMTYgaXRlbXMpIHRvIDE2IChlcXVpdmFsZW50IHRvIHNheWluZyAiaXQgZGVmaW5pdGVseSBoYXBwZW5zIiBmb3IgYWxsIDE2IGl0ZW1zKS4KCmBgYHtyfQpkX3Bvcl9zY29yZWRfbWIgPC0gZF9wb3Jfc2NvcmVkICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzY29yZSIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoZXBpX2N0cnkgPSBmYWN0b3IoZXBpX2N0cnksIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKQoKIyBlZmZlY3QtY29kZSBieSBkZWZhdWx0CmNvbnRyYXN0cyhkX3Bvcl9zY29yZWQkZXBpX2N0cnkpIDwtIGNvbnRyLnN1bSg1KQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42LCBpbmNsdWRlID0gVH0KcG9yX3Bsb3RfYSA8LSBnZ3Bsb3QoZF9wb3Jfc2NvcmVkLAogICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gc2NvcmUsIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCoxNiwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41KjE2LCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxKjE2LCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuNCwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9wb3Jfc2NvcmVkX21iLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBmYXR0ZW4gPSAyKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLmZyYW1lKHggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjKDAqMTYsIDAuNSoxNiwgMSoxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYiA9IGMoIn4gQWxsIGFuc3dlcnMgJ2l0IGRvZXMgbm90IGhhcHBlbiciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJ+IEFsbCBhbnN3ZXJzICdpdCBtaWdodCBoYXBwZW4nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifiBBbGwgYW5zd2VycyAnaXQgZGVmaW5pdGVseSBoYXBwZW5zJyIpKSwKICAgICAgICAgICAgYWVzKHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWIpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgbnVkZ2VfeSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTYsIDQpKSArCiAgIyB5bGltKDAsIDE2KSArCiAgbGFicyh0aXRsZSA9ICJQb3Jvc2l0eSBieSBzaXRlIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiUG9yb3NpdHkgc2NvcmUgKGF2ZXJhZ2UgcmVzcG9uc2UsIHJhbmdlOiAwLTE2KSIpCgpwb3JfcGxvdF9iIDwtIGdncGxvdChkX3Bvcl9zY29yZWRfbWIsCiAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXBpX2N0cnksIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKjE2LCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUqMTYsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSoxNiwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSA0LCBzaG93LmxlZ2VuZCA9IEYpICsKICAjIGdlb21fdGV4dChkYXRhID0gZGF0YS5mcmFtZSh4ID0gMC41LAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjUgKiAxNiwgIyBjKDAqMTYsIDAuNSoxNiwgMSoxNiksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiID0gIn4gQWxsIGFuc3dlcnMgJ21heWJlJyIpLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYygifiBBbGwgYW5zd2VycyAnaXQgZG9lcyBub3QgaGFwcGVuJyIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICJ+IEFsbCBhbnN3ZXJzICdpdCBtaWdodCBoYXBwZW4nIiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIn4gQWxsIGFuc3dlcnMgJ2l0IGRlZmluaXRlbHkgaGFwcGVucyciKSksCiAgIyAgICAgICAgICAgYWVzKHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWIpLCAKICAjICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgbnVkZ2VfeSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTYsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJQb3Jvc2l0eSBieSBzaXRlICh6b29tZWQgaW4pIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiUG9yb3NpdHkgc2NvcmUgKGF2ZXJhZ2UgcmVzcG9uc2UsIHJhbmdlOiAwLTE2KSIpCgpwbG90X2dyaWQocG9yX3Bsb3RfYSwgcG9yX3Bsb3RfYiwgbmNvbCA9IDIpCmBgYAoKRnJvbSB0aGVzZSBwbG90cywgaXQgaXMgY2xlYXIgdGhhdCB3aGlsZSB0aGVyZSB3YXMgc3Vic3RhbnRpYWwgdmFyaWFiaWxpdHkgYWNyb3NzIGluZGl2aWR1YWxzIHdpdGhpbiBlYWNoIHNpdGUsIHBhcnRpY2lwYW50cycgYXZlcmFnZSByZXNwb25zZSBhbHNvIHZhcmllZCBmYWlybHkgZHJhbWF0aWNhbGx5IGFjcm9zcyBzaXRlcywgd2l0aCBwYXJ0aWNpcGFudHMgaW4gQ2hpbmEgZW5kb3JzaW5nIHRoZSBmZXdlc3QgaXRlbXMsIHBhcnRpY2lwYW50cyBpbiB0aGUgVVMgYW5kIFRoYWlsYW5kIGVuZG9yc2luZyBzbGlnaHRseSBtb3JlLCBhbmQgcGFydGljaXBhbnRzIGluIEdoYW5hIGFuZCBWYW51YXR1IGVuZG9yc2luZyB0aGUgbW9zdC4KCmBgYHtyfQpyX3BvciA8LSBsbShzY29yZSB+IGVwaV9jdHJ5LCBkX3Bvcl9zY29yZWQsCiAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZXBpX2N0cnkgPSBjb250cmFzdHNfY3RyeV9jdHIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0Kc3VtbWFyeShyX3BvcikkY29lZmZpY2llbnRzICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInBhcmFtZXRlciIpICU+JQogIHJlbmFtZShiID0gRXN0aW1hdGUsIGBzdGFuZGFyZCBlcnJvcmAgPSBTdGQuLkVycm9yLCBgdGAgPSB0LnZhbHVlLAogICAgICAgICBwID0gUHIuLi50Li4pICU+JQogIG11dGF0ZV9hdCh2YXJzKC1wYXJhbWV0ZXIsIC1wKSwgZnVucyhyb3VuZCguLCAyKSkpICU+JQogIG11dGF0ZShwID0gaWZlbHNlKHAgPCAwLjAwMSwgIjwwLjAwMSIsIHJvdW5kKHAsIDMpKSwKICAgICAgICAgc2lnbmlmaWNhbnQgPSBpZmVsc2UocCA8IDAuMDUsICIqIiwgIiIpKSAlPiUKICBrYWJsZShhbGlnbiA9IGMoImwiLCByZXAoInIiLCA1KSwgImwiKSwKICAgICAgICBjYXB0aW9uID0gIkNvbXBhcmluZyBwb3Jvc2l0eSBzY29yZXMgYWNyb3NzIHNpdGVzIFttb2RlbDogbG0oc2NvcmUgfiBlcGlfY3RyeSwgZF9wb3Jfc2NvcmVkKV0iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygyOjUpLCBib2xkID0gVCkKYGBgCgpgYGB7cn0Kcl9wb3JfbWl4ZWQgPC0gbG1lcihyZXNwb25zZSB+IGVwaV9jdHJ5CiAgICAgICAgICAgICAgICAgICAgKyAoMSB8IGVwaV9zdWJqKSArIChlcGlfY3RyeSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICAgICBkX3BvciwKICAgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGVwaV9jdHJ5ID0gY29udHJhc3RzX2N0cnlfY3RyKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnN1bW1hcnkocl9wb3JfbWl4ZWQpJGNvZWZmaWNpZW50cyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBgc3RhbmRhcmQgZXJyb3JgID0gU3RkLi5FcnJvciwgYHRgID0gdC52YWx1ZSwKICAgICAgICAgcCA9IFByLi4udC4uKSAlPiUKICBtdXRhdGVfYXQodmFycygtcGFyYW1ldGVyLCAtcCksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAga2FibGUoYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgNSksICJsIiksCiAgICAgICAgY2FwdGlvbiA9ICJDb21wYXJpbmcgcG9yb3NpdHkgcmVzcG9uc2VzIGFjcm9zcyBzaXRlcyBbbW9kZWw6IGxtZXIocmVzcG9uc2UgfiBlcGlfY3RyeSArICgxIHwgZXBpX3N1YmopICsgKGVwaV9jdHJ5IHwgcXVlc3Rpb24pXSIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDI6NSksIGJvbGQgPSBUKQpgYGAKCkkgcmFuIHR3byBraW5kcyBvZiBzdGF0aXN0aWNhbCBhbmFseXNlcyBvZiB0aGVzZSByZXN1bHRzOiBPbmUgY29tcGFyaW5nIHRoZXNlIGF2ZXJhZ2Ugc2NvcmVzIGFjcm9zcyBzaXRlcyAodG9wIHRhYmxlKSwgYW5kIHRoZSBvdGhlciB0YWtpbmcgaW50byBhY2NvdW50IHZhcmlhYmlsaXR5IGFjcm9zcyBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhbmQgYWNyb3NzIGluZGl2aWR1YWwgaXRlbXMgaW4gdGhlIHNjYWxlIChib3R0b20gdGFibGUpLiBUaGVvcmV0aWNhbGx5LCB0aGVzZSBhbmFseXNlcyBzaG91bGQgeWllbGQgcHJldHR5IHNpbWlsYXIgcmVzdWx0cywgc28gSSB3b3VsZCBiZSBlc3BlY2lhbGx5IGNvbmZpZGVudCBpbiBlZmZlY3RzIHRoYXQgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIHRoZSB0d28gYW5hbHlzZXMgYW5kIHRoYXQgc2VlbSBvYnZpb3VzIGZyb20gdGhlIHBsb3RzLgoKQm90aCBhbmFseXNlcyBzdWdnZXN0IHRoYXQgcGFydGljaXBhbnRzIGluIHNpdGVzIG91dHNpZGUgb2YgdGhlIFVTIGdlbmVyYWxseSBoYWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgUG9yb3NpdHkgc2NvcmVzIHRoYW4gcGFydGljaXBhbnRzIGluIHRoZSBVUyAoc2VlICJlcGlfY3RyeW5vblVTX1VTIiByb3dzKeKAlGJ1dCBsb29raW5nIGF0IHRoZSBwbG90cyBpdCBpcyBjbGVhciB0aGF0IHRoaXMgd2FzIGRyaXZlbiBieSBwYXJ0aWNpcGFudHMgaW4gR2hhbmEgYW5kIFZhbnVhdHUsIGFuZCB3YXMgbm90IHRydWUsIG9uIGF2ZXJhZ2UsIGFtb25nIHBhcnRpY2lwYW50cyBpbiBUaGFpbGFuZCBvciBDaGluYS4gSW4gbGluZSB3aXRoIHRoaXMsIGJvdGggYW5hbHlzZXMgc3VnZ2VzdCB0aGF0IHBhcnRpY2lwYW50cyBpbiBHaGFuYSBhbmQgVmFudWF0dSBoYWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgUG9yb3NpdHkgc2NvcmVzIHRoYW4gcGFydGljaXBhbnRzIGluIFRoYWlsYW5kIGFuZCBDaGluYeKAlGFuZCB0aGF0IHRoaXMgZGlmZmVyZW5jZSB3YXMgZmFyIGdyZWF0ZXIgdGhhbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJ0aGUgV2VzdCB2cy4gdGhlIHJlc3QiIChzZWUgImVwaV9jdHJ5bm9uVVNfVVMiIHJvd3MpLiBCb3RoIGFuYWx5c2VzIGFsc28gc3VnZ2VzdCB0aGF0IHBhcnRpY2lwYW50cyBpbiBUaGFpbGFuZCBoYWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgUG9yb3NpdHkgc2NvcmVzLCBvbiBhdmVyYWdlLCB0aGFuIHBhcnRpY2lwYW50cyBpbiBDaGluYSAoc2VlICJlcGlfY3RyeVRIX0NIIiByb3dzKS4KCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQnkgaXRlbQoKTmV4dCwgSSdsbCBleGFtaW5lIHJlc3BvbnNlcyB0byBpbmRpdmlkdWFsIGl0ZW1zIG9uIHRoZSBQb3Jvc2l0eSBzY2FsZSwgZmlyc3QgZm9jdXNpbmcgb24gdGhlIGJhc2ljIGl0ZW1zIGFuZCB0aGVuIHR1cm5pbmcgdG8gdGhlIGZvbGxvdy11cCBxdWVzdGlvbnMgYW5kIGEgZmV3IHNpdGUtc3BlY2lmaWMgcXVlc3Rpb25zLiBGb3IgZWFjaCBpdGVtLCBwYXJ0aWNpcGFudHMgY291bGQgc2F5ICJpdCBkb2VzIG5vdCBoYXBwZW4iIChzY29yZWQgYXMgMCksICJpdCBtaWdodCBoYXBwZW4iIChzY29yZWQgYXMgMC41KSwgb3IgIml0IGRlZmluaXRlbHkgaGFwcGVucyIgKHNjb3JlZCBhcyAxKS4KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMSwgaW5jbHVkZSA9IFR9CmRfcG9yICU+JQogIGZpbHRlcighZ3JlcGwoImEiLCBxdWVzdGlvbiksICFncmVwbCgiYiIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICFncmVwbCgiYyIsIHF1ZXN0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoZXBpX2N0cnksIHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBvcmRlcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicmVzcG9uc2UiLCBuYS5ybSA9IFQpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZXBpX2N0cnksIHkgPSBtZWFuLCBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGZhY2V0X3dyYXAofiByZW9yZGVyKHN0cl93cmFwKHF1ZXN0aW9uX3RleHQsIDUwKSwgb3JkZXIpLCBuY29sID0gNCkgKwogIGdlb21faml0dGVyKGRhdGEgPSBkX3BvciAlPiUgCiAgICAgICAgICAgICAgICBmaWx0ZXIoIWdyZXBsKCJhIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImIiLCBxdWVzdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICFncmVwbCgiYyIsIHF1ZXN0aW9uKSksIGFlcyh5ID0gcmVzcG9uc2UpLCAKICAgICAgICAgICAgICBoZWlnaHQgPSAwLjA1LCBhbHBoYSA9IDAuMDgsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBvcm9zaXR5IHNjYWxlOiBSZXNwb25zZXMgdG8gaW5kaXZpZHVhbCBpdGVtcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCAKICAgICAgIHkgPSAiTWVhbiByZXNwb25zZSAoMCA9IGl0IGRvZXMgbm90IGhhcHBlbiwgMC41ID0gaXQgbWlnaHQgaGFwcGVuLCAxID0gaXQgZGVmaW5pdGVseSBoYXBwZW5zIikKYGBgCgpUaGVyZSBpcyBzbyBtdWNoIHRvIHVucGFjayBoZXJlISBXaGVuIEkgbG9vayBhdCB0aGVzZSBpdGVtcywgYSBmZXcgdGhpbmdzIHRoYXQgSSB0aGluayBhYm91dCBhcmU6CgotIFdoaWNoIGl0ZW1zIHRlbmQgdG8gZm9sbG93IHRoZSBvdmVyYWxsIHBhdHRlcm4gZXN0YWJsaXNoZWQgYnkgdGhlICJvdmVyYWxsIHNjb3JlcyIgcHJlc2VudGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uPyAoZS5nLiwgcXVlc3Rpb24gIzEsIG1hbnkgb3RoZXJzKQotIEFtb25nIGl0ZW1zIHRoYXQgZm9sbG93IHRoZSBvdmVyYWxsIHBhdHRlcm4sIGZvciB3aGljaCBpdGVtcyBpcyB0aGlzIHBhdHRlcm4gZXhhZ2dlcmF0ZWQ/IChlLmcuLCBxdWVzdGlvbnMgIzUsICMxMikgRm9yIHdoaWNoIGl0ZW1zIGlzIHRoaXMgcGF0dGVybiBhdHRlbnR1YXRlZD8gKGUuZy4sIHF1ZXNpdG9ucyAjMiwgIzMpIAotIFdoaWNoIGl0ZW1zIGRvIF9ub3RfIGZvbGxvdyB0aGlzIG92ZXJhbGwgdHJlbmQ/IChlLmcuLCBxdWVzdGlvbiAjMTYpCi0gV2hpY2ggaXRlbXMgc2VlbSB0byBwaWNrIG91dCBhbiBleHBlcmllbmNlIHRoYXQgaXMgdW5pcXVlbHkgc2FsaWVudC9wcmV2YWxlbnQgaW4gYSBwYXJ0aWN1bGFyIHNpdGU/IChlLmcuLCBxdWVzdGlvbnMgIzcsICMxNikKCl9Ob3RlIHRoYXQgSSBqdXN0IHBpY2tlZCBvdXQgYSBmZXcgZXhhbXBsZXMgdG8gaWxsdXN0cmF0ZSB3aGF0IEkgbWVhbiwgYnV0IHRoZXJlIGFyZSBjZXJ0YWlubHkgb3RoZXIgaW50ZXJlc3RpbmcgY2FzZXMgdGhhdCBtaWdodCBiZSB3b3J0aCB0aGlua2luZyBhYm91dCBtb3JlIGRlZXBseSAtIGUuZy4sIHF1ZXN0aW9uICMxNSwgd2hlcmUgVVMgcGFydGljaXBhbnRzIGFwcGVhciBtb3JlIGxpa2UgR2hhbmFpYW4gJiBuaS1WYW4gcGFydGljaXBhbnRzIHRoYW4gVGhhaSBvciBDaGluZXNlIHBhcnRpY2lwYW50cykuXyAKCkhlcmUgYXJlIHBhcnRpY2lwYW50cycgYW5zd2VycyB0byB0aGUgZm9sbG93LXVwIHF1ZXN0aW9ucyBmb3IgYSBzdWJzZXQgb2YgdGhvc2UgYmFzaWMgaXRlbXM6CgpgYGB7cn0KcG9yX2Z1X3F1ZXN0aW9uX3RleHQgPC0gZF9wb3IgJT4lCiAgZmlsdGVyKHF1ZXN0aW9uICVpbiUgYygiZXBpXzFfMDEiLCAiZXBpXzFfMDQiLCAiZXBpXzFfMDYiLCAiZXBpXzFfMDciLAogICAgICAgICAgICAgICAgICAgICAgICAgImVwaV8xXzExIiwgImVwaV8xXzE0IikpICU+JQogIGRpc3RpbmN0KHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBvcmRlcikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBhcy5jaGFyYWN0ZXIocXVlc3Rpb25fdGV4dCkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjgsIGluY2x1ZGUgPSBUfQpkX3BvciAlPiUKICBmaWx0ZXIoZ3JlcGwoImEiLCBxdWVzdGlvbikgfCBncmVwbCgiYiIsIHF1ZXN0aW9uKSB8IGdyZXBsKCJjIiwgcXVlc3Rpb24pKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJ1c2EiLCBxdWVzdGlvbiksICFncmVwbCgiZ2hhIiwgcXVlc3Rpb24pLCAKICAgICAgICAgIWdyZXBsKCJjaG4iLCBxdWVzdGlvbiksICFncmVwbCgidnV0IiwgcXVlc3Rpb24pLAogICAgICAgICAhZ3JlcGwoInRobCIsIHF1ZXN0aW9uKSkgJT4lIAogIGdyb3VwX2J5KGVwaV9jdHJ5LCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgb3JkZXIpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInJlc3BvbnNlIiwgbmEucm0gPSBUKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gbWVhbiwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCAzMCksIG9yZGVyKSwgbmNvbCA9IDYpICsKICBnZW9tX2ppdHRlcihkYXRhID0gZF9wb3IgJT4lIAogICAgICAgICAgICAgICAgZmlsdGVyKGdyZXBsKCJhIiwgcXVlc3Rpb24pIHwgZ3JlcGwoImIiLCBxdWVzdGlvbikgfAogICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImMiLCBxdWVzdGlvbikpICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKCFncmVwbCgidXNhIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImdoYSIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIWdyZXBsKCJjaG4iLCBxdWVzdGlvbiksICFncmVwbCgidnV0IiwgcXVlc3Rpb24pLAogICAgICAgICAgICAgICAgICAgICAgICFncmVwbCgidGhsIiwgcXVlc3Rpb24pKSwgYWVzKHkgPSByZXNwb25zZSksIAogICAgICAgICAgICAgIGhlaWdodCA9IDAuMDUsIGFscGhhID0gMC4wOCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyLCAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQb3Jvc2l0eSBzY2FsZTogUmVzcG9uc2VzIHRvIGZvbGxvdy11cCBxdWVzdGlvbnMiLAogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAocG9yX2Z1X3F1ZXN0aW9uX3RleHQkcXVlc3Rpb25fdGV4dCAlPiUgcGFzdGUwKGNvbGxhcHNlID0gJ1xuJyksICJcblxuTm90ZTogdGhlc2UgcXVlc3Rpb25zIGFyZSBOT1QgY3VycmVudGx5IGluY2x1ZGVkIGluIFBvcm9zaXR5ICdzY29yZXMnXG5FcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIpLAogICAgICAgeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UgKDAgPSBubywgMSA9IGEgbGl0dGxlLCAyID0gYSBsb3QpIikKYGBgCgpBbmQgaGVyZSBhcmUgcGFydGljaXBhbnRzJyBhbnN3ZXJzIHRvIGEgZmV3IHNpdGUtc3BlY2lmaWMgcXVlc3Rpb25zOgoKYGBge3J9CnBvcl9zaXRlc3BlY19xdWVzdGlvbl90ZXh0IDwtIGRfcG9yICU+JQogIGZpbHRlcihncmVwbCgidXNhIiwgcXVlc3Rpb24pIHwgZ3JlcGwoImdoYSIsIHF1ZXN0aW9uKSB8CiAgICAgICAgIGdyZXBsKCJjaG4iLCBxdWVzdGlvbil8IGdyZXBsKCJ2dXQiLCBxdWVzdGlvbikgfAogICAgICAgICBncmVwbCgidGhsIiwgcXVlc3Rpb24pKSAlPiUKICBkaXN0aW5jdChxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgb3JkZXIpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gYXMuY2hhcmFjdGVyKHF1ZXN0aW9uX3RleHQpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC40LCBpbmNsdWRlID0gVH0KZF9wb3IgJT4lCiAgZmlsdGVyKGdyZXBsKCJ1c2EiLCBxdWVzdGlvbikgfCBncmVwbCgiZ2hhIiwgcXVlc3Rpb24pIHwKICAgICAgICAgZ3JlcGwoImNobiIsIHF1ZXN0aW9uKXwgZ3JlcGwoInZ1dCIsIHF1ZXN0aW9uKSB8CiAgICAgICAgIGdyZXBsKCJ0aGwiLCBxdWVzdGlvbikpICU+JSAKICBncm91cF9ieShlcGlfY3RyeSwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIG9yZGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJyZXNwb25zZSIsIG5hLnJtID0gVCkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4sIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHJlb3JkZXIoc3RyX3dyYXAocXVlc3Rpb25fdGV4dCwgNDApLCBvcmRlciksIAogICAgICAgICAgICAgbmNvbCA9IDQsIHNjYWxlcyA9ICJmcmVlX3giKSArCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IGRfcG9yICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcihncmVwbCgidXNhIiwgcXVlc3Rpb24pIHwgZ3JlcGwoImdoYSIsIHF1ZXN0aW9uKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiY2huIiwgcXVlc3Rpb24pfCBncmVwbCgidnV0IiwgcXVlc3Rpb24pIHwKICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJ0aGwiLCBxdWVzdGlvbikpLCBhZXMoeSA9IHJlc3BvbnNlKSwgCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjA4LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCAKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQb3Jvc2l0eSBzY2FsZTogUmVzcG9uc2VzIHRvIHNpdGUtc3BlY2lmaWMgcXVlc3Rpb25zIiwKICAgICAgIHN1YnRpdGxlID0gIk5vdGU6IHRoZXNlIHF1ZXN0aW9ucyBhcmUgTk9UIGN1cnJlbnRseSBpbmNsdWRlZCBpbiBQb3Jvc2l0eSAnc2NvcmVzJ1xuRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UgKDAgPSBubywgMC41ID0gbWF5YmUsIDEgPSB5ZXMpIikKYGBgCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIFByYXllciAoc3Bpcml0dWFsIGV4cGVyaWVuY2UgUXVlc3Rpb24gIzEpCgpGb3IgU3Bpcml0dWFsIEVwaWRlbWlvbG9neSwgdGhlICJzcGlyaXR1YWwgZXhwZXJpZW5jZSIgcG9ydGlvbiBvZiB0aGUgZXBpZGVtaW9sb2d5IGJlZ2FuIHdpdGggdHdvIHF1ZXN0aW9ucyBpbnRlbmRlZCB0byBnYXVnZSBwYXJ0aWNpcGFudHMnIHByYXllciBwcmFjdGljZS4gSGVyZSBhcmUgcGFydGljaXBhbnRzJyByZXNwb25zZXMgdG8gdGhlc2UgdHdvIHF1ZXN0aW9uczoKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC4zNSwgaW5jbHVkZSA9IFR9CmRfcHJheWVyICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5LCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgb3JkZXIpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInJlc3BvbnNlIiwgbmEucm0gPSBUKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gbWVhbiwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCA5MCksIG9yZGVyKSwgbmNvbCA9IDIsCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2ppdHRlcihkYXRhID0gZF9wcmF5ZXIsIGFlcyh5ID0gcmVzcG9uc2UpLCAKICAgICAgICAgICAgICBoZWlnaHQgPSAwLjA1LCBhbHBoYSA9IDAuMDgsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNCwgMC41KSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUHJheWVyIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzXG5Gb3IgcXVlc3Rpb24gIzEsIDAgPSBubywgMSA9IHllczsgZm9yIHF1ZXN0aW9uICMxYSwgMSA9IDAtMTVtaW4sIDIgPSAxNS0zMG1pbiwgMyA9IDMwLTYwbWluLCA0ID0gPjYwbWluIiwKICAgICAgIHggPSAiU2l0ZSIsIAogICAgICAgeSA9ICJNZWFuIHJlc3BvbnNlIChzY2FsZXMgdmFyaWVkIGJ5IHF1ZXN0aW9uKSIpCmBgYAoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBBbGwgc3Bpcml0dWFsIGV4cGVyaWVuY2VzIChRdWVzdGlvbnMgIzItMjMpCgpGb3IgU3Bpcml0dWFsIEVwaWRlbWlvbG9neSwgdGhlIFNwaXJpdHVhbCBFeHBlcmllbmNlcyBzY2FsZSBjb25zaXN0ZWQgb2YgMjIgYmFzaWMgaXRlbXMgKDM0IGJhc2ljIGl0ZW1zIGluIFRoYWlsYW5kKSwgYW5kIGZvbGxvdy11cCBxdWVzdGlvbnMgdG8gYSBzdWJzZXQgb2YgdGhlc2UgaXRlbXMuIEZvciBlYWNoIG9mIHRoZSBiYXNpYyBpdGVtcywgcGFydGljaXBhbnRzIGNvdWxkIHJlc3BvbmQgYnkgc2F5aW5nICJubyIgKHNjb3JlZCBhcyAwKSwgIm1heWJlIiAoc2NvcmVkIGFzIDAuNTsgdGhpcyBtaWdodCBoYXZlIG9ubHkgYmVlbiBhdmFpbGFibGUgaW4gc29tZSBzaXRlcz8pLCBvciAieWVzIiAoc2NvcmVkIGFzIDEpLgoKX05vdGU6IEluIGFkZGl0aW9uIHRvIHRoZXNlIDIyIGl0ZW1zLCB0aGVyZSB3ZXJlIHR3byBpdGVtcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoaXMgc2VjdGlvbiBvbiAic3Bpcml0dWFsIGV4cGVyaWVuY2VzIiB0aGF0IHdlcmUgaW50ZW5kZWQgdG8gZ2F1Z2UgcGFydGljaXBhbnRzJyBwcmF5ZXIgcHJhY3RpY2UgLSBzZWUgW1ByYXllciAoc3Bpcml0dWFsIGV4cGVyaWVuY2UgUXVlc3Rpb24gIzEpXSwgYWJvdmUuXwoKIyMgT3ZlcmFsbCBzY29yZXMKCkZpcnN0LCBJJ2xsIGV4YW1pbmUgb3ZlcmFsbCAic2NvcmVzIiBvbiB0aGlzIHNjYWxlLCB0YWtpbmcgaW50byBhY2NvdW50IG9ubHkgdGhlIGJhc2ljIGl0ZW1zIChub3QgdGhlIGZvbGxvdy11cCBxdWVzdGlvbnMpLiAKCkluIFRoYWlsYW5kLCB0aGVyZSB3ZXJlIGFuIGFkZGl0aW9uYWwgMTIgcXVlc2l0b25zIChhYm91dCBleHBlcmllbmNlcyBvZiBhZGRpdGlvbmFsICJiZWluZ3MiKSB0aGF0OyBJIGhhdmUgdHJlYXRlZCB0aGlzIGRpc2NyZXBhbmN5IGFjcm9zcyBzaXRlcyBpbiB0d28gZGlmZmVyZW50IHdheXMgYmVsb3c6ICgxKSBDb25zZGVyaW5nIGFsbCBiZWluZ3MgYW5kIHVzaW5nIHByb3BvcnRpb25zLCByYXRoZXIgdGhhbiBzdW1zLCBhcyAic2NvcmVzIiAoZXF1aXZhbGVudCB0byBhc2tpbmcsIGZvciBlYWNoIHBhcnRpY2lhbnQsIHdoYXQgcHJvcG9ydGlvbiBvZiB0aGUgaXRlbXMgdGhleSB3ZXJlIGV4cG9zZWQgdG8gZGlkIHRoZXkgZW5kb3JzZT8pOyBhbmQgKDIpIENvbnNpZGVyaW5nIG9ubHkgdGhlIGZpcnN0IDUgYmVpbmdzIGFza2VkIGFib3V0IGluIGVhY2ggc2l0ZSwgc3VjaCB0aGF0IGFsbCBwYXJ0aWNpcGFudHMgd2VyZSBhc2tlZCB0aGUgc2FtZSBudW1iZXIgb2YgcXVlc3Rpb25zLgoKIyMgQ29uc2lkZXJpbmcgYWxsICJiZWluZ3MiCgpVc2luZyB0aGUgZmlyc3QgYXBwcm9hY2ggKGNvbnNpZGVyaW5nIGFsbCAiYmVpbmdzLCIgd2l0aCAxMiBtb3JlIGJlaW5ncyBpbiBUaGFpbGFuZCB0aGFuIGluIGFueSBvdGhlciBzaXRlKSwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMCAoZXF1aXZhbGVudCB0byBzYXlpbmcgIm5vIiBmb3IgYWxsIDIyLTM0IGl0ZW1zKSB0byAxIChlcXVpdmFsZW50IHRvIHNheWluZyAieWVzIiBmb3IgYWxsIDIyLTM0IGl0ZW1zKS4KCmBgYHtyfQpkX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX3Byb3BhbGxfbWIgPC0gZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9wcm9wYWxsICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42LCBpbmNsdWRlID0gVH0Kc3BleF9xMnRvMjNfcGxvdF9hIDwtIGdncGxvdChkX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX3Byb3BhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gc2NvcmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCoxLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUqMSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSoxLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuNCwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9wcm9wYWxsX21iLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMiwgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGMoMCoxLCAwLjUqMSwgMSoxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiID0gYygifiBBbGwgYW5zd2VycyAnbm8nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJ+IEFsbCBhbnN3ZXJzICdtYXliZSciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ+IEFsbCBhbnN3ZXJzICd5ZXMnIikpLAogICAgICAgICAgICBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYiksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBudWRnZV95ID0gMC4wNSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4xKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzIChRdWVzdGlvbnMgIzItMjMpIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGFsbCBiZWluZ3MgZm9yIFRoYWlsYW5kXG5FcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIlByb3BvcnRpb24gc2NvcmUgKHJhbmdlOiAwLTEpIikKCnNwZXhfcTJ0bzIzX3Bsb3RfYiA8LSBnZ3Bsb3QoZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9wcm9wYWxsX21iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4sIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDQsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4xKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzICh6b29tZWQgaW4pIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGFsbCBiZWluZ3MgZm9yIFRoYWlsYW5kXG5FcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIlByb3BvcnRpb24gc2NvcmUgKHJhbmdlOiAwLTEpIikKCnBsb3RfZ3JpZChzcGV4X3EydG8yM19wbG90X2EsIHNwZXhfcTJ0bzIzX3Bsb3RfYiwgbmNvbCA9IDIpCmBgYAoKRnJvbSB0aGVzZSBwbG90cywgaXQgaXMgY2xlYXIgdGhhdCB3aGlsZSB0aGVyZSB3YXMgc3Vic3RhbnRpYWwgdmFyaWFiaWxpdHkgYWNyb3NzIGluZGl2aWR1YWxzIHdpdGhpbiBlYWNoIHNpdGUsIHBhcnRpY2lwYW50c+KAmSBhdmVyYWdlIHJlc3BvbnNlIGFsc28gdmFyaWVkIGZhaXJseSBkcmFtYXRpY2FsbHkgYWNyb3NzIHNpdGVzLCB3aXRoIHBhcnRpY2lwYW50cyBpbiBDaGluYSBlbmRvcnNpbmcgdGhlIGZld2VzdCBpdGVtcywgcGFydGljaXBhbnRzIGluIHRoZSBVUyBhbmQgVGhhaWxhbmQgZW5kb3JzaW5nIHNsaWdodGx5IG1vcmUsIGFuZCBwYXJ0aWNpcGFudHMgaW4gR2hhbmEgYW5kIFZhbnVhdHUgZW5kb3JzaW5nIHRoZSBtb3N0LiBUaGlzIGlzIHRoZSBzYW1lIHBhdHRlcm4gd2Ugb2JzZXJ2ZWQgZm9yIFtQb3Jvc2l0eV0gc2NvcmVzLCBhYm92ZS4KCmBgYHtyfQpyX3EydG8yM19zY29yZWRfcHJvcGFsbCA8LSBsbShzY29yZSB+IGVwaV9jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9wcm9wYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGVwaV9jdHJ5ID0gY29udHJhc3RzX2N0cnlfY3RyKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnN1bW1hcnkocl9xMnRvMjNfc2NvcmVkX3Byb3BhbGwpJGNvZWZmaWNpZW50cyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBgc3RhbmRhcmQgZXJyb3JgID0gU3RkLi5FcnJvciwgYHRgID0gdC52YWx1ZSwKICAgICAgICAgcCA9IFByLi4udC4uKSAlPiUKICBtdXRhdGVfYXQodmFycygtcGFyYW1ldGVyLCAtcCksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAga2FibGUoYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgNSksICJsIiksCiAgICAgICAgY2FwdGlvbiA9ICJDb21wYXJpbmcgc3Bpcml0dWFsIGV4cGVyaWVuY2Ugc2NvcmVzIGFjcm9zcyBzaXRlcyBbbW9kZWw6IGxtKHNjb3JlIH4gZXBpX2N0cnksIGRfc3BleF9iYXNlX3EydG8yM19zY29yZWRfcHJvcGFsbCldIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMjo1KSwgYm9sZCA9IFQpCmBgYAoKYGBge3J9CnJfcTJ0bzIzX3Byb3BhbGxfbWl4ZWQgPC0gbG1lcihyZXNwb25zZSB+IGVwaV9jdHJ5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSB8IGVwaV9zdWJqKSArIChlcGlfY3RyeSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfc3BleF9iYXNlX3EydG8yMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZXBpX2N0cnkgPSBjb250cmFzdHNfY3RyeV9jdHIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0Kc3VtbWFyeShyX3EydG8yM19wcm9wYWxsX21peGVkKSRjb2VmZmljaWVudHMgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigicGFyYW1ldGVyIikgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgYHN0YW5kYXJkIGVycm9yYCA9IFN0ZC4uRXJyb3IsIGB0YCA9IHQudmFsdWUsCiAgICAgICAgIHAgPSBQci4uLnQuLikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXBhcmFtZXRlciwgLXApLCBmdW5zKHJvdW5kKC4sIDIpKSkgJT4lCiAgbXV0YXRlKHAgPSBpZmVsc2UocCA8IDAuMDAxLCAiPDAuMDAxIiwgcm91bmQocCwgMykpLAogICAgICAgICBzaWduaWZpY2FudCA9IGlmZWxzZShwIDwgMC4wNSwgIioiLCAiIikpICU+JQogIGthYmxlKGFsaWduID0gYygibCIsIHJlcCgiciIsIDUpLCAibCIpLAogICAgICAgIGNhcHRpb24gPSAiQ29tcGFyaW5nIHNwaXJpdHVhbCBleHBlcmllbmNlIHJlc3BvbnNlcyBhY3Jvc3Mgc2l0ZXMgW21vZGVsOiBsbWVyKHJlc3BvbnNlIH4gZXBpX2N0cnkgKyAoMSB8IGVwaV9zdWJqKSArIChlcGlfY3RyeSB8IHF1ZXN0aW9uKSwgZF9zcGV4X2Jhc2VfcTJ0bzIzKV0iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygyOjUpLCBib2xkID0gVCkKYGBgCgpBZ2FpbiwgSSByYW4gdHdvIGtpbmRzIG9mIHN0YXRpc3RpY2FsIGFuYWx5c2VzIG9mIHRoZXNlIHJlc3VsdHM6IE9uZSBjb21wYXJpbmcgdGhlc2Ugc2NvcmVzIGFjcm9zcyBzaXRlcyAodG9wIHRhYmxlKSwgYW5kIHRoZSBvdGhlciB0YWtpbmcgaW50byBhY2NvdW50IHZhcmlhYmlsaXR5IGFjcm9zcyBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhbmQgYWNyb3NzIGluZGl2aWR1YWwgaXRlbXMgaW4gdGhlIHNjYWxlIChib3R0b20gdGFibGUpLiBUaGVvcmV0aWNhbGx5LCB0aGVzZSBhbmFseXNlcyBzaG91bGQgeWllbGQgcHJldHR5IHNpbWlsYXIgcmVzdWx0cywgc28gSSB3b3VsZCBiZSBlc3BlY2lhbGx5IGNvbmZpZGVudCBpbiBlZmZlY3RzIHRoYXQgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIHRoZSB0d28gYW5hbHlzZXMgYW5kIHRoYXQgc2VlbSBvYnZpb3VzIGZyb20gdGhlIHBsb3RzLgoKQm90aCBhbmFseXNlcyBzdWdnZXN0IHRoYXQgcGFydGljaXBhbnRzIGluIHNpdGVzIG91dHNpZGUgb2YgdGhlIFVTIGdlbmVyYWxseSBoYWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgUG9yb3NpdHkgc2NvcmVzIHRoYW4gcGFydGljaXBhbnRzIGluIEdoYW5hIGFuZCBWYW51YXR1IGhhZCBzaWduaWZpY2FudGx5IGhpZ2hlciBQb3Jvc2l0eSBzY29yZXMgdGhhbiBwYXJ0aWNpcGFudHMgaW4gVGhhaWxhbmQgYW5kIENoaW5hIChzZWUg4oCcZXBpX2N0cnlub25VU19VU+KAnSByb3dzKSwgYW5kIHRoYXQgcGFydGljaXBhbnRzIGluIFRoYWlsYW5kIGhhZCBzaWduaWZpY2FudGx5IGhpZ2hlciBQb3Jvc2l0eSBzY29yZXMsIG9uIGF2ZXJhZ2UsIHRoYW4gcGFydGljaXBhbnRzIGluIENoaW5hIChzZWUg4oCcZXBpX2N0cnlUSF9DSOKAnSByb3dzKS4KCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ29uc2lkZXJpbmcgZmlyc3QgZml2ZSAiYmVpbmdzIiBvbmx5CgpVc2luZyB0aGUgc2Vjb25kIGFwcHJvYWNoIChjb25zaWRlcmluZyBvbmx5IHRoZSBmaXJzdCBmaXZlICJiZWluZ3MiIGluIGVhY2ggc2l0ZSksIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAgKGVxdWl2YWxlbnQgdG8gc2F5aW5nICJubyIgZm9yIGFsbCAyMiBpdGVtcykgdG8gMjIgKGVxdWl2YWxlbnQgdG8gc2F5aW5nICJ5ZXMiIGZvciBhbGwgMjIgaXRlbXMpLgoKYGBge3J9CmRfc3BleF9iYXNlX3EydG8yM19zY29yZWRfZmlyc3Q1X21iIDwtIGRfc3BleF9iYXNlX3EydG8yM19zY29yZWRfZmlyc3Q1ICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42LCBpbmNsdWRlID0gVH0Kc3BleF9xMnRvMjNfcGxvdF9jIDwtIGdncGxvdChkX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX2ZpcnN0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXBpX2N0cnksIHkgPSBzY29yZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBlcGlfY3RyeSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKjIyLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUqMjIsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEqMjIsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC40LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX2ZpcnN0NV9tYiwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDIsIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLmZyYW1lKHggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjKDAqMjIsIDAuNSoyMiwgMSoyMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYiA9IGMoIn4gQWxsIGFuc3dlcnMgJ25vJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAifiBBbGwgYW5zd2VycyAnbWF5YmUnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifiBBbGwgYW5zd2VycyAneWVzJyIpKSwKICAgICAgICAgICAgYWVzKHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWIpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgbnVkZ2VfeSA9IDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyLCAyKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzIChRdWVzdGlvbnMgIzItMjMpIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGZpcnN0IGZpdmUgYmVpbmdzIGZvciBhbGwgc2l0ZXNcbkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiU3VtIHNjb3JlIChyYW5nZTogMC0yMikiKQoKc3BleF9xMnRvMjNfcGxvdF9kIDwtIGdncGxvdChkX3NwZXhfYmFzZV9xMnRvMjNfc2NvcmVkX2ZpcnN0NV9tYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXBpX2N0cnksIHkgPSBtZWFuLCBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSA0LCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyLCAyKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzICh6b29tZWQgaW4pIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGZpcnN0IGZpdmUgYmVpbmdzIGZvciBhbGwgc2l0ZXNcbkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiU3VtIHNjb3JlIChyYW5nZTogMC0yMikiKQoKcGxvdF9ncmlkKHNwZXhfcTJ0bzIzX3Bsb3RfYywgc3BleF9xMnRvMjNfcGxvdF9kLCBuY29sID0gMikKYGBgCgpUaGVzZSBwbG90cyBsb29rIHZlcnkgc2ltaWxhciB0byB0aGUgcGxvdHMgY29uc2lkZXJpbmcgYWxsIGJlaW5ncyAod2hpY2ggSSBmaW5kIHJlYXNzdXJpbmcpLgoKYGBge3J9CnJfcTJ0bzIzX3Njb3JlZF9maXJzdDUgPC0gbG0oc2NvcmUgfiBlcGlfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9maXJzdDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChlcGlfY3RyeSA9IGNvbnRyYXN0c19jdHJ5X2N0cikpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpzdW1tYXJ5KHJfcTJ0bzIzX3Njb3JlZF9maXJzdDUpJGNvZWZmaWNpZW50cyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBgc3RhbmRhcmQgZXJyb3JgID0gU3RkLi5FcnJvciwgYHRgID0gdC52YWx1ZSwKICAgICAgICAgcCA9IFByLi4udC4uKSAlPiUKICBtdXRhdGVfYXQodmFycygtcGFyYW1ldGVyLCAtcCksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAga2FibGUoYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgNSksICJsIiksCiAgICAgICAgY2FwdGlvbiA9ICJDb21wYXJpbmcgc3Bpcml0dWFsIGV4cGVyaWVuY2Ugc2NvcmVzIGFjcm9zcyBzaXRlcyBbbW9kZWw6IGxtKHNjb3JlIH4gZXBpX2N0cnksIGRfc3BleF9iYXNlX3EydG8yM19zY29yZWRfZmlyc3Q1KV0iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygyOjUpLCBib2xkID0gVCkKYGBgCgpgYGB7cn0Kcl9xMnRvMjNfZmlyc3Q1X21peGVkIDwtIGxtZXIocmVzcG9uc2UgfiBlcGlfY3RyeSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSB8IGVwaV9zdWJqKSArIChlcGlfY3RyeSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9zcGV4X2Jhc2VfcTJ0bzIzICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighcXVlc3Rpb24gJWluJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJlcGlfMl90aGwxMmUiLCAiZXBpXzJfdGhsMTJmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBpXzJfdGhsMTJnIiwgImVwaV8yX3RobDEyaCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwaV8yX3RobDEyaSIsICJlcGlfMl90aGwxMmoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwaV8yX3RobDEyayIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChlcGlfY3RyeSA9IGNvbnRyYXN0c19jdHJ5X2N0cikpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpzdW1tYXJ5KHJfcTJ0bzIzX2ZpcnN0NV9taXhlZCkkY29lZmZpY2llbnRzICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInBhcmFtZXRlciIpICU+JQogIHJlbmFtZShiID0gRXN0aW1hdGUsIGBzdGFuZGFyZCBlcnJvcmAgPSBTdGQuLkVycm9yLCBgdGAgPSB0LnZhbHVlLAogICAgICAgICBwID0gUHIuLi50Li4pICU+JQogIG11dGF0ZV9hdCh2YXJzKC1wYXJhbWV0ZXIsIC1wKSwgZnVucyhyb3VuZCguLCAyKSkpICU+JQogIG11dGF0ZShwID0gaWZlbHNlKHAgPCAwLjAwMSwgIjwwLjAwMSIsIHJvdW5kKHAsIDMpKSwKICAgICAgICAgc2lnbmlmaWNhbnQgPSBpZmVsc2UocCA8IDAuMDUsICIqIiwgIiIpKSAlPiUKICBrYWJsZShhbGlnbiA9IGMoImwiLCByZXAoInIiLCA1KSwgImwiKSwKICAgICAgICBjYXB0aW9uID0gIkNvbXBhcmluZyBzcGlyaXR1YWwgZXhwZXJpZW5jZSByZXNwb25zZXMgYWNyb3NzIHNpdGVzIFttb2RlbDogbG1lcihyZXNwb25zZSB+IGVwaV9jdHJ5ICsgKDEgfCBlcGlfc3ViaikgKyAoZXBpX2N0cnkgfCBxdWVzdGlvbiksIGRfc3BleF9iYXNlX3EydG8yMyAlPiUgZmlsdGVyKC4uLikpXSIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDI6NSksIGJvbGQgPSBUKQpgYGAKClRoaXMgcGF0dGVybiBvZiByZXN1bHRzIGFyZSBpZGVudGljYWwgdG8gdGhlIHBhdHRlcm4gb2YgcmVzdWx0cyBjb25zaWRlcmluZyBhbGwgYmVpbmdzICh3aGljaCwgYWdhaW4sIEkgZmluZCByZWFzc3VyaW5nKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CioqSW4gdGhlIGZvbGxvd2luZyBmb3VyIHNlY3Rpb25zIChbU3Bpcml0dWFsIGV4cGVyaWVuY2VzOiBVbml2ZXJzYWwgcXVlc3Rpb25zLCBzZXQgMSAoUXVlc3Rpb25zICMyLTEwKV0sIFtTcGlyaXR1YWwgZXhwZXJpZW5jZXM6IEJlaW5ncyBxdWVzdGlvbnMgKFF1ZXN0aW9ucyAjMTEtMTUgKyBtb3JlIGZvciBUaGFpbGFuZCldLCBbU3Bpcml0dWFsIGV4cGVyaWVuY2VzOiBVbml2ZXJzYWwgcXVlc3Rpb25zLCBzZXQgMiAoUXVlc3Rpb25zICMxNi0yMSldLCBhbmQgW1NwaXJpdHVhbCBleHBlcmllbmNlczogVW5pdmVyc2FsIHF1ZXN0aW9ucywgc2V0IDMgKFF1ZXN0aW9ucyAjMjItMjMpXSksIEkgbG9vayBhdCBzY29yZXMgZm9yIHN1Yi1zZWN0aW9ucyBvZiB0aGUgU3Bpcml0dWFsIEV4cGVyaWVuY2Ugc2NhbGUsIGFuZCBhdCByZXNwb25zZXMgdG8gaW5kaXZpZHVhbCBpdGVtcyBpbiB0aGlzIHNjYWxlLCBpbmNsdWRpbmcgZm9sbG93LXVwIGl0ZW1zLioqIEkgZG8gbm90IHByb3ZpZGUgdGV4dCBjb21tZW50YXJ5IG9uIHRoZXNlIGFkZGl0aW9uYWwgcGxvdHMgYW5kIGFuYWx5c2VzIGF0IHRoaXMgdGltZSwgYnV0IHRoZXkgYWxsIGZvbGxvdyB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgcGxvdHMgYW5kIGFuYWx5c2VzIHRoYXQgSSBoYXZlIGFubm90YXRlZCBhYm92ZS4KCgojIFNwaXJpdHVhbCBleHBlcmllbmNlczogVW5pdmVyc2FsIHF1ZXN0aW9ucywgc2V0IDEgKFF1ZXN0aW9ucyAjMi0xMCkKCiMjIE92ZXJhbGwgc2NvcmVzCgpgYGB7cn0KZF9zcGV4X2Jhc2VfcTJ0bzEwX3Njb3JlZF9tYiA8LSBkX3NwZXhfYmFzZV9xMnRvMTBfc2NvcmVkICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42LCBpbmNsdWRlID0gVH0Kc3BleF8ydG8xMF9wbG90X2EgPC0gZ2dwbG90KGRfc3BleF9iYXNlX3EydG8xMF9zY29yZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gc2NvcmUsIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCo5LCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUqOSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSo5LCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLjEsIHdpZHRoID0gMC40LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX3NwZXhfYmFzZV9xMnRvMTBfc2NvcmVkX21iLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMiwgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGMoMCo5LCAwLjUqOSwgMSo5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiID0gYygifiBBbGwgYW5zd2VycyAnbm8nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJ+IEFsbCBhbnN3ZXJzICdtYXliZSciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ+IEFsbCBhbnN3ZXJzICd5ZXMnIikpLAogICAgICAgICAgICBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYiksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBudWRnZV95ID0gMC41KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA5LCAxKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzIChRdWVzdGlvbnMgIzItMTApIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTkpIikKCnNwZXhfMnRvMTBfcGxvdF9iIDwtIGdncGxvdChkX3NwZXhfYmFzZV9xMnRvMTBfc2NvcmVkX21iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4sIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDQsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOSwgMSkpICsKICBsYWJzKHRpdGxlID0gIlNwaXJpdHVhbCBleHBlcmllbmNlcyAoem9vbWVkIGluKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIlNjb3JlIChyYW5nZTogMC05KSIpCgpwbG90X2dyaWQoc3BleF8ydG8xMF9wbG90X2EsIHNwZXhfMnRvMTBfcGxvdF9iLCBuY29sID0gMikKYGBgCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIEJ5IGl0ZW0KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMSwgaW5jbHVkZSA9IFR9CmRfc3BleF9iYXNlX3EydG8xMCAlPiUKICBncm91cF9ieShlcGlfY3RyeSwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIG9yZGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJyZXNwb25zZSIsIG5hLnJtID0gVCkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4sIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHN0cl93cmFwKHF1ZXN0aW9uX3RleHQsIDUwKSwgbmNvbCA9IDMpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCA2MCksIG9yZGVyKSwgbmNvbCA9IDMpICsKICBnZW9tX2ppdHRlcihkYXRhID0gZF9zcGV4X2Jhc2VfcTJ0bzEwLCBhZXMoeSA9IHJlc3BvbnNlKSwgCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjA4LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCAKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJTcGlyaXR1YWwgZXhwZXJpZW5jZXMgIzItMTA6IFJlc3BvbnNlcyB0byBpbmRpdmlkdWFsIGl0ZW1zIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIAogICAgICAgeSA9ICJNZWFuIHJlc3BvbnNlLCBpLmUuLCBwcm9wb3J0aW9uIHJlc3BvbmRpbmcgJ3llcycgKDAgPSBubywgMSA9IHllcykiKQpgYGAKCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzOiBCZWluZ3MgcXVlc3Rpb25zIChRdWVzdGlvbnMgIzExLTE1ICsgbW9yZSBmb3IgVGhhaWxhbmQpCgojIyBPdmVyYWxsIHNjb3JlcwoKIyMjIENvbnNpZGVyaW5nIGFsbCAiYmVpbmdzIiAobW9yZSBmb3IgVGhhaWxhbmQpCgpgYGB7cn0KZF9zcGV4X2Jhc2VfcTExdG8xNV9zY29yZWRfcHJvcGFsbF9tYiA8LSBkX3NwZXhfYmFzZV9xMTF0bzE1X3Njb3JlZCAlPiUKICBncm91cF9ieShlcGlfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2NvcmVfcHJvcGFsbCIsIG5hLnJtID0gVCkgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjYsIGluY2x1ZGUgPSBUfQpzcGV4XzExdG8xNV9wbG90X2EgPC0gZ2dwbG90KGRfc3BleF9iYXNlX3ExMXRvMTVfc2NvcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBlcGlfY3RyeSwgeSA9IHNjb3JlX3Byb3BhbGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCoxLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUqMSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSoxLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLjAyLCB3aWR0aCA9IDAuNCwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9zcGV4X2Jhc2VfcTExdG8xNV9zY29yZWRfcHJvcGFsbF9tYiwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDIsIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLmZyYW1lKHggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjKDAqMSwgMC41KjEsIDEqMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYiA9IGMoIn4gQWxsIGFuc3dlcnMgJ25vJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAifiBBbGwgYW5zd2VycyAnbWF5YmUnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifiBBbGwgYW5zd2VycyAneWVzJyIpKSwKICAgICAgICAgICAgYWVzKHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWIpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGhqdXN0ID0gMCwgbnVkZ2VfeSA9IDAuMDUpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMikpICsKICBsYWJzKHRpdGxlID0gIlNwaXJpdHVhbCBleHBlcmllbmNlcyAoUXVlc3Rpb25zICMxMS0xNSspIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGFsbCBiZWluZ3MgZm9yIFRoYWlsYW5kXG5FcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIlByb3BvcnRpb24gc2NvcmUgKHJhbmdlOiAwLTEpIikKCnNwZXhfMTF0bzE1X3Bsb3RfYiA8LSBnZ3Bsb3QoZF9zcGV4X2Jhc2VfcTExdG8xNV9zY29yZWRfcHJvcGFsbF9tYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXBpX2N0cnksIHkgPSBtZWFuLCBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSA0LCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMikpICsKICBsYWJzKHRpdGxlID0gIlNwaXJpdHVhbCBleHBlcmllbmNlcyAoem9vbWVkIGluKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJJbmNsdWRlcyBhbGwgYmVpbmdzIGZvciBUaGFpbGFuZFxuRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgeSA9ICJQcm9wb3J0aW9uIHNjb3JlIChyYW5nZTogMC0xKSIpCgpwbG90X2dyaWQoc3BleF8xMXRvMTVfcGxvdF9hLCBzcGV4XzExdG8xNV9wbG90X2IsIG5jb2wgPSAyKQpgYGAKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMjIENvbnNpZGVyaW5nIGZpcnN0IGZpdmUgImJlaW5ncyIgb25seQoKYGBge3J9CmRfc3BleF9iYXNlX3ExMXRvMTVfc2NvcmVkX2ZpcnN0NV9tYiA8LSBkX3NwZXhfYmFzZV9xMTF0bzE1X3Njb3JlZCAlPiUKICBncm91cF9ieShlcGlfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2NvcmVfZmlyc3Q1IiwgbmEucm0gPSBUKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IFR9CnNwZXhfMTF0bzE1X3Bsb3RfYyA8LSBnZ3Bsb3QoZF9zcGV4X2Jhc2VfcTExdG8xNV9zY29yZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gc2NvcmVfZmlyc3Q1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAqNSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41KjUsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEqNSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMC4xLCB3aWR0aCA9IDAuNCwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9zcGV4X2Jhc2VfcTExdG8xNV9zY29yZWRfZmlyc3Q1X21iLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMiwgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGMoMCo1LCAwLjUqNSwgMSo1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiID0gYygifiBBbGwgYW5zd2VycyAnbm8nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJ+IEFsbCBhbnN3ZXJzICdtYXliZSciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ+IEFsbCBhbnN3ZXJzICd5ZXMnIikpLAogICAgICAgICAgICBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYiksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBudWRnZV95ID0gMC4yNSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNSwgMSkpICsKICBsYWJzKHRpdGxlID0gIlNwaXJpdHVhbCBleHBlcmllbmNlcyAoUXVlc3Rpb25zICMxMS0xNSspIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGZpcnN0IGZpdmUgYmVpbmdzIGZvciBhbGwgc2l0ZXNcbkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiU3VtIHNjb3JlIChyYW5nZTogMC01KSIpCgpzcGV4XzExdG8xNV9wbG90X2QgPC0gZ2dwbG90KGRfc3BleF9iYXNlX3ExMXRvMTVfc2NvcmVkX2ZpcnN0NV9tYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXBpX2N0cnksIHkgPSBtZWFuLCBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSA0LCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDUsIDEpKSArCiAgbGFicyh0aXRsZSA9ICJTcGlyaXR1YWwgZXhwZXJpZW5jZXMgKHpvb21lZCBpbikiLAogICAgICAgc3VidGl0bGUgPSAiSW5jbHVkZXMgZmlyc3QgZml2ZSBiZWluZ3MgZm9yIGFsbCBzaXRlc1xuRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgeSA9ICJTdW0gc2NvcmUgKHJhbmdlOiAwLTUpIikKCnBsb3RfZ3JpZChzcGV4XzExdG8xNV9wbG90X2MsIHNwZXhfMTF0bzE1X3Bsb3RfZCwgbmNvbCA9IDIpCmBgYAoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBCeSBpdGVtCgpgYGB7cn0Kc3BleF8xMXRvMTVfcGxvdF91cyA8LSBkX3NwZXhfYmFzZV9xMTF0bzE1ICU+JQogIGZpbHRlcihlcGlfY3RyeSA9PSAiVVMiLCBncmVwbCgidXNhIiwgcXVlc3Rpb24pKSAlPiUKICBncm91cF9ieShlcGlfY3RyeSwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIG9yZGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJyZXNwb25zZSIsIG5hLnJtID0gVCkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4pKSArCiAgZmFjZXRfd3JhcCh+IHJlb3JkZXIoc3RyX3dyYXAocXVlc3Rpb25fdGV4dCwgNDApLCBvcmRlciksIG5jb2wgPSA1KSArCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IGRfc3BleF9iYXNlX3ExMXRvMTUgJT4lIAogICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJVUyIsIGdyZXBsKCJ1c2EiLCBxdWVzdGlvbikpLCAKICAgICAgICAgICAgICBhZXMoeSA9IHJlc3BvbnNlKSwgCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjA4LCBjb2xvciA9ICIjMWI5ZTc3Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSAiVVMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzICMxMS0xNTogUmVzcG9uc2VzIHRvIGluZGl2aWR1YWwgaXRlbXMiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UgKDAgPSBubywgMSA9IHllcykiKQpgYGAKCmBgYHtyfQpzcGV4XzExdG8xNV9wbG90X2doIDwtIGRfc3BleF9iYXNlX3ExMXRvMTUgJT4lCiAgZmlsdGVyKGVwaV9jdHJ5ID09ICJHaGFuYSIsIGdyZXBsKCJnaGEiLCBxdWVzdGlvbikpICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5LCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgb3JkZXIpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInJlc3BvbnNlIiwgbmEucm0gPSBUKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gbWVhbikpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCA0MCksIG9yZGVyKSwgbmNvbCA9IDUpICsKICBnZW9tX2ppdHRlcihkYXRhID0gZF9zcGV4X2Jhc2VfcTExdG8xNSAlPiUgCiAgICAgICAgICAgICAgICBmaWx0ZXIoZXBpX2N0cnkgPT0gIkdoYW5hIiwgZ3JlcGwoImdoYSIsIHF1ZXN0aW9uKSksIAogICAgICAgICAgICAgIGFlcyh5ID0gcmVzcG9uc2UpLCAKICAgICAgICAgICAgICBoZWlnaHQgPSAwLjA1LCBhbHBoYSA9IDAuMDgsIGNvbG9yID0gIiNkOTVmMDIiLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCAKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9ICJHSEFOQSBTcGlyaXR1YWwgZXhwZXJpZW5jZXMgIzExLTE1OiBSZXNwb25zZXMgdG8gaW5kaXZpZHVhbCBpdGVtcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCAKICAgICAgIHkgPSAiTWVhbiByZXNwb25zZSAoMCA9IG5vLCAxID0geWVzKSIpCmBgYAoKYGBge3J9CnNwZXhfMTF0bzE1X3Bsb3RfdGggPC0gZF9zcGV4X2Jhc2VfcTExdG8xNSAlPiUKICBmaWx0ZXIoZXBpX2N0cnkgPT0gIlRoYWlsYW5kIiwgZ3JlcGwoInRobCIsIHF1ZXN0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoZXBpX2N0cnksIHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBvcmRlcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicmVzcG9uc2UiLCBuYS5ybSA9IFQpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZXBpX2N0cnksIHkgPSBtZWFuKSkgKwogIGZhY2V0X3dyYXAofiByZW9yZGVyKHN0cl93cmFwKHF1ZXN0aW9uX3RleHQsIDQwKSwgb3JkZXIpLCBuY29sID0gNSkgKwogIGdlb21faml0dGVyKGRhdGEgPSBkX3NwZXhfYmFzZV9xMTF0bzE1ICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiVGhhaWxhbmQiLCBncmVwbCgidGhsIiwgcXVlc3Rpb24pKSwgCiAgICAgICAgICAgICAgYWVzKHkgPSByZXNwb25zZSksIAogICAgICAgICAgICAgIGhlaWdodCA9IDAuMDUsIGFscGhhID0gMC4wOCwgY29sb3IgPSAiIzc1NzBiMyIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBsYWJzKHRpdGxlID0gIlRIQUlMQU5EIFNwaXJpdHVhbCBleHBlcmllbmNlcyAjMTEtMTU6IFJlc3BvbnNlcyB0byBpbmRpdmlkdWFsIGl0ZW1zIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIAogICAgICAgeSA9ICJNZWFuIHJlc3BvbnNlICgwID0gbm8sIDEgPSB5ZXMpIikKYGBgCgpgYGB7cn0Kc3BleF8xMXRvMTVfcGxvdF9jaCA8LSBkX3NwZXhfYmFzZV9xMTF0bzE1ICU+JQogIGZpbHRlcihlcGlfY3RyeSA9PSAiQ2hpbmEiLCBncmVwbCgiY2huIiwgcXVlc3Rpb24pKSAlPiUKICBncm91cF9ieShlcGlfY3RyeSwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIG9yZGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJyZXNwb25zZSIsIG5hLnJtID0gVCkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4pKSArCiAgZmFjZXRfd3JhcCh+IHJlb3JkZXIoc3RyX3dyYXAocXVlc3Rpb25fdGV4dCwgNDApLCBvcmRlciksIG5jb2wgPSA1KSArCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IGRfc3BleF9iYXNlX3ExMXRvMTUgJT4lIAogICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJDaGluYSIsIGdyZXBsKCJjaG4iLCBxdWVzdGlvbikpLCAKICAgICAgICAgICAgICBhZXMoeSA9IHJlc3BvbnNlKSwgCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjA4LCBjb2xvciA9ICIjZTcyOThhIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSAiQ0hJTkEgU3Bpcml0dWFsIGV4cGVyaWVuY2VzICMxMS0xNTogUmVzcG9uc2VzIHRvIGluZGl2aWR1YWwgaXRlbXMiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UgKDAgPSBubywgMSA9IHllcykiKQpgYGAKCmBgYHtyfQpzcGV4XzExdG8xNV9wbG90X3Z0IDwtIGRfc3BleF9iYXNlX3ExMXRvMTUgJT4lCiAgZmlsdGVyKGVwaV9jdHJ5ID09ICJWYW51YXR1IiwgZ3JlcGwoInZ1dCIsIHF1ZXN0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoZXBpX2N0cnksIHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBvcmRlcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicmVzcG9uc2UiLCBuYS5ybSA9IFQpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZXBpX2N0cnksIHkgPSBtZWFuKSkgKwogIGZhY2V0X3dyYXAofiByZW9yZGVyKHN0cl93cmFwKHF1ZXN0aW9uX3RleHQsIDQwKSwgb3JkZXIpLCBuY29sID0gNSkgKwogIGdlb21faml0dGVyKGRhdGEgPSBkX3NwZXhfYmFzZV9xMTF0bzE1ICU+JSAKICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiVmFudWF0dSIsIGdyZXBsKCJ2dXQiLCBxdWVzdGlvbikpLCAKICAgICAgICAgICAgICBhZXMoeSA9IHJlc3BvbnNlKSwgCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjA4LCBjb2xvciA9ICIjNjZhNjFlIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSAiVkFOVUFUVSBTcGlyaXR1YWwgZXhwZXJpZW5jZXMgIzExLTE1OiBSZXNwb25zZXMgdG8gaW5kaXZpZHVhbCBpdGVtcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCAKICAgICAgIHkgPSAiTWVhbiByZXNwb25zZSAoMCA9IG5vLCAxID0geWVzKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAxLjcsIGluY2x1ZGUgPSBGfQojIHBsb3RfZ3JpZChzcGV4XzExdG8xNV9wbG90X3VzLCBzcGV4XzExdG8xNV9wbG90X2doLCBzcGV4XzExdG8xNV9wbG90X3RoLAojICAgICAgICAgICBzcGV4XzExdG8xNV9wbG90X2NoLCBzcGV4XzExdG8xNV9wbG90X3Z0LCBuY29sID0gMSwKIyAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDIsIDEsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMiwgaW5jbHVkZSA9IFR9CmRfc3BleF9iYXNlX3ExMXRvMTUgJT4lCiAgZ3JvdXBfYnkoZXBpX2N0cnksIHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBvcmRlcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicmVzcG9uc2UiLCBuYS5ybSA9IFQpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShtZWFuKSwgbWVhbiAhPSAiTmFOIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCA2MCksIGRlc2Mob3JkZXIpKSwgCiAgICAgICAgICAgICB5ID0gbWVhbiwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF9ncmlkKGVwaV9jdHJ5IH4gLiwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21faml0dGVyKGRhdGEgPSBkX3NwZXhfYmFzZV9xMTF0bzE1ICU+JSBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSksCiAgICAgICAgICAgICAgYWVzKHkgPSByZXNwb25zZSksCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4wNSwgYWxwaGEgPSAwLjA4LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzICMxMS0xNTpcblJlc3BvbnNlcyB0byBpbmRpdmlkdWFsIGl0ZW1zIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiUXVlc3Rpb24iLCAKICAgICAgIHkgPSAiTWVhbiByZXNwb25zZSwgaS5lLiwgcHJvcG9ydGlvbiByZXNwb25kaW5nICd5ZXMnICgwID0gbm8sIDEgPSB5ZXMpIikgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzOiBVbml2ZXJzYWwgcXVlc3Rpb25zLCBzZXQgMiAoUXVlc3Rpb25zICMxNi0yMSkKCiMjIE92ZXJhbGwgc2NvcmVzCgpgYGB7cn0KZF9zcGV4X2Jhc2VfcTE2dG8yMV9zY29yZWRfbWIgPC0gZF9zcGV4X2Jhc2VfcTE2dG8yMV9zY29yZWQgJT4lCiAgZ3JvdXBfYnkoZXBpX2N0cnkpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInNjb3JlIikgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjYsIGluY2x1ZGUgPSBUfQpzcGV4X3ExNnRvMjFfcGxvdF9hIDwtIGdncGxvdChkX3NwZXhfYmFzZV9xMTZ0bzIxX3Njb3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXBpX2N0cnksIHkgPSBzY29yZSwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKjYsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSo2LCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxKjYsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAuMiwgd2lkdGggPSAwLjQsIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGRfc3BleF9iYXNlX3ExNnRvMjFfc2NvcmVkX21iLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMiwgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGMoMCo2LCAwLjUqNiwgMSo2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiID0gYygifiBBbGwgYW5zd2VycyAnbm8nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJ+IEFsbCBhbnN3ZXJzICdtYXliZSciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ+IEFsbCBhbnN3ZXJzICd5ZXMnIikpLAogICAgICAgICAgICBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYiksCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgaGp1c3QgPSAwLCBudWRnZV95ID0gMC4yNSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNiwgMSkpICsKICBsYWJzKHRpdGxlID0gIlNwaXJpdHVhbCBleHBlcmllbmNlcyAoUXVlc3Rpb25zICMxNi0yMSkiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgeSA9ICJTY29yZSAocmFuZ2U6IDAtNikiKQoKc3BleF9xMTZ0bzIxX3Bsb3RfYiA8LSBnZ3Bsb3QoZF9zcGV4X2Jhc2VfcTE2dG8yMV9zY29yZWRfbWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gbWVhbiwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gNCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2LCAxKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzICh6b29tZWQgaW4pIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTYpIikKCnBsb3RfZ3JpZChzcGV4X3ExNnRvMjFfcGxvdF9hLCBzcGV4X3ExNnRvMjFfcGxvdF9iLCBuY29sID0gMikKYGBgCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIEJ5IGl0ZW0KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43LCBpbmNsdWRlID0gVH0KZF9zcGV4X2Jhc2VfcTE2dG8yMSAlPiUKICBncm91cF9ieShlcGlfY3RyeSwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIG9yZGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJyZXNwb25zZSIsIG5hLnJtID0gVCkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4sIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHN0cl93cmFwKHF1ZXN0aW9uX3RleHQsIDUwKSwgbmNvbCA9IDMpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCA2MSksIG9yZGVyKSwgbmNvbCA9IDMpICsKICBnZW9tX2ppdHRlcihkYXRhID0gZF9zcGV4X2Jhc2VfcTE2dG8yMSwgYWVzKHkgPSByZXNwb25zZSksIAogICAgICAgICAgICAgIGhlaWdodCA9IDAuMDUsIGFscGhhID0gMC4wOCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzICMxNi0yMTogUmVzcG9uc2VzIHRvIGluZGl2aWR1YWwgaXRlbXMiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UsIGkuZS4sIHByb3BvcnRpb24gcmVzcG9uZGluZyAneWVzJyAoMCA9IG5vLCAxID0geWVzKSIpCmBgYAoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBTcGlyaXR1YWwgZXhwZXJpZW5jZXM6IFVuaXZlcnNhbCBxdWVzdGlvbnMsIHNldCAzIChRdWVzdGlvbnMgIzIyLTIzKQoKIyMgT3ZlcmFsbCBzY29yZXMKCmBgYHtyfQpkX3NwZXhfYmFzZV9xMjJ0bzIzX3Njb3JlZF9tYiA8LSBkX3NwZXhfYmFzZV9xMjJ0bzIzX3Njb3JlZCAlPiUKICBncm91cF9ieShlcGlfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2NvcmUiKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IFR9CnNwZXhfcTIydG8yM19wbG90X2EgPC0gZ2dwbG90KGRfc3BleF9iYXNlX3EyMnRvMjNfc2NvcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBlcGlfY3RyeSwgeSA9IHNjb3JlLCBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAqMiwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41KjIsIGx0eSA9IDIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEqMiwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMC4yLCB3aWR0aCA9IDAuNCwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9zcGV4X2Jhc2VfcTIydG8yM19zY29yZWRfbWIsCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAyLCBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChkYXRhID0gZGF0YS5mcmFtZSh4ID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYygwKjIsIDAuNSoyLCAxKjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIgPSBjKCJ+IEFsbCBhbnN3ZXJzICdubyciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIn4gQWxsIGFuc3dlcnMgJ21heWJlJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn4gQWxsIGFuc3dlcnMgJ3llcyciKSksCiAgICAgICAgICAgIGFlcyh4ID0geCwgeSA9IHksIGxhYmVsID0gbGFiKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBoanVzdCA9IDAsIG51ZGdlX3kgPSAwLjEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIsIDEpKSArCiAgbGFicyh0aXRsZSA9ICJTcGlyaXR1YWwgZXhwZXJpZW5jZXMgKFF1ZXN0aW9ucyAjMjItMjMpIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiU2l0ZSIsIHkgPSAiU2NvcmUgKHJhbmdlOiAwLTIpIikKCnNwZXhfcTIydG8yM19wbG90X2IgPC0gZ2dwbG90KGRfc3BleF9iYXNlX3EyMnRvMjNfc2NvcmVkX21iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBlcGlfY3RyeSwgeSA9IG1lYW4sIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDQsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMiwgMSkpICsKICBsYWJzKHRpdGxlID0gIlNwaXJpdHVhbCBleHBlcmllbmNlcyAoem9vbWVkIGluKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIlNjb3JlIChyYW5nZTogMC0yKSIpCgpwbG90X2dyaWQoc3BleF9xMjJ0bzIzX3Bsb3RfYSwgc3BleF9xMjJ0bzIzX3Bsb3RfYiwgbmNvbCA9IDIpCmBgYAoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBCeSBpdGVtCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuMzUsIGluY2x1ZGUgPSBUfQpkX3NwZXhfYmFzZV9xMjJ0bzIzICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5LCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgb3JkZXIpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInJlc3BvbnNlIiwgbmEucm0gPSBUKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IGVwaV9jdHJ5LCB5ID0gbWVhbiwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0LCA5MCksIG9yZGVyKSwgbmNvbCA9IDMpICsKICBnZW9tX2ppdHRlcihkYXRhID0gZF9zcGV4X2Jhc2VfcTIydG8yMywgYWVzKHkgPSByZXNwb25zZSksIAogICAgICAgICAgICAgIGhlaWdodCA9IDAuMDUsIGFscGhhID0gMC4wOCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiU3Bpcml0dWFsIGV4cGVyaWVuY2VzICMyMi0yMzogUmVzcG9uc2VzIHRvIGluZGl2aWR1YWwgaXRlbXMiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJTaXRlIiwgCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UsIGkuZS4sIHByb3AuIHJlc3BvbmRpbmcgJ3llcydcbigwID0gbm8sIDEgPSB5ZXMpIikKYGBgCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiBwb3Jvc2l0eSBhbmQgc3Bpcml0dWFsIGV4cGVyaWVuY2UKCkZpbmFsbHksIEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gUG9yb3NpdHkgc2NvcmVzIGFuZCBTcGlyaXR1YWwgRXhwZXJpZW5jZSBzY29yZXMsIGNvbXBhcmluZyB0aGlzIHJlbGF0aW9uc2hpcCBhY3Jvc3Mgc2l0ZXMgYW5kIGV4YW1pbmluZyB0aGlzIHJlbGF0aW9uc2hpcCB3aXRoaW4gZWFjaCBzaXRlIGluZGl2ZGlkdWFsbHkuIEFnYWluLCBJIHdpbGwgZXhwbG9yZSB0d28gd2F5cyBvZiBoYW5kbGluZyB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiBxdWVzdGlvbnMgYXNrZWQgaW4gVGhhaWxhbmQgdnMuIG90aGVyIHNpdGVzLgoKIyMgQ29uc2lkZXJpbmcgYWxsICJiZWluZ3MiIChtb3JlIGZvciBUaGFpbGFuZCkKCmBgYHtyfQpkX3Bvcl9zcGV4X2Jhc2VfcTJ0bzIzX3Byb3BhbGwgPC0gZF9zcGV4X2Jhc2VfcTJ0bzIzX3Njb3JlZF9wcm9wYWxsICU+JSAKICByZW5hbWUoc3BleF9zY29yZV9wcm9wYWxsID0gc2NvcmUpICU+JQogIGZ1bGxfam9pbihkX3Bvcl9zY29yZWQgJT4lIHJlbmFtZShwb3Jfc2NvcmUgPSBzY29yZSkpICU+JQogIGdyb3VwX2J5KGVwaV9jdHJ5KSAlPiUKICBtdXRhdGUocG9yX3Njb3JlX3N0ZCA9IHNjYWxlKHBvcl9zY29yZSksCiAgICAgICAgIHNwZXhfc2NvcmVfcHJvcGFsbF9zdGQgPSBzY2FsZShzcGV4X3Njb3JlX3Byb3BhbGwpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHBvcl9zY29yZV9zdGRfY29sbGFwc2UgPSBzY2FsZShwb3Jfc2NvcmUpLAogICAgICAgICBzcGV4X3Njb3JlX3Byb3BhbGxfc3RkX2NvbGxhcHNlID0gc2NhbGUoc3BleF9zY29yZV9wcm9wYWxsKSkKCiMgZWZmZWN0LWNvZGUgYnkgZGVmYXVsdApjb250cmFzdHMoZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsJGVwaV9jdHJ5KSA8LSBjb250ci5zdW0oNSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuMzUsIGluY2x1ZGUgPSBGfQpnZ3Bsb3QoZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsLAogICAgICAgYWVzKHggPSBwb3Jfc2NvcmUsIHkgPSBzcGV4X3Njb3JlX3Byb3BhbGwsIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IGVwaV9jdHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2LCA0KSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcm9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJJbmNsdWRlcyBhbGwgYmVpbmdzIGZvciBUaGFpbGFuZCIsCiAgICAgICB4ID0gIlBvcm9zaXR5IHNjb3JlICgwLTE2KSIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBleHBlcmllbmNlXG5wcm9wb3J0aW9uIHNjb3JlICgwLTEpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuMywgaW5jbHVkZSA9IFR9CmdncGxvdChkX3Bvcl9zcGV4X2Jhc2VfcTJ0bzIzX3Byb3BhbGwsCiAgICAgICBhZXMoeCA9IHBvcl9zY29yZV9zdGRfY29sbGFwc2UsIHkgPSBzcGV4X3Njb3JlX3Byb3BhbGxfc3RkX2NvbGxhcHNlLCAKICAgICAgICAgICBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGZhY2V0X3dyYXAofiBlcGlfY3RyeSwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtNCwgNCwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC00LCA0LCAxKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICAgbGFicyh0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3Jvc2l0eSBhbmQgc3Bpcml0dWFsIGV4cGVyaWVuY2UiLAogICAgICAgc3VidGl0bGUgPSAiSW5jbHVkZXMgYWxsIGJlaW5ncyBmb3IgVGhhaWxhbmQiLAogICAgICAgeCA9ICJQb3Jvc2l0eSBzY29yZSAoc3RhbmRhcmRpemVkIGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzKSIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBleHAuIHByb3BvcnRpb24gc2NvcmVcbihzdGQuIGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzKSIpCmBgYAoKRnJvbSB0aGUgcGxvdCwgaXQgaXMgY2xlYXIgdGhhdCB0aGVyZSBpcyBhIGdlbmVyYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gUG9yb3NpdHkgYW5kIFNwaXJpdHVhbCBFeHBlcmllbmNlIHNjb3Jlcy4gVGhlIHN0cmVuZ3RoIG9mIHRoaXMgcmVsYXRpb25zaGlwcyBhcHBlYXJzIHRvIHZhcnkgc29tZXdoYXQgYWNyb3NzIHNpdGVzLCBidXQgdmlzdWFsIGluc3BlY3Rpb24gc3VnZ2VzdHMgdGhhdCB0aGlzIHJlbGF0aW9uc2hpcCBpcyBwcmVzZW50IHRvIHNvbWUgZGVncmVlIGluIGVhY2ggc2l0ZSBpbmRpdmlkdWFsbHkuIAoKRmlyc3QsIEknbGwgbG9vayBhdCB0aGlzIHJlbGF0aW9uc2hpcCBjb25zaWRlcmluZyBhbGwgc2l0ZXMgaW4gdGhlIHNhbWUgYW5hbHlzaXMgKHN0YW5kYXJkaXppbmcgc2NvcmVzIGNvbGxhcHNpbmcgYWNyb3NzIGFsbCBzaXRlcywgdG8gbWFpbnRhaW4gdGhlIHBhdHRlcm4gZm8gZ2VuZXJhbCBkaWZmZXJlbmNlcyBpbiBQb3Jvc2l0eSBhbmQgU3Bpcml0dWFsIEV4cGVyaWVuY2UgYWNyb3NzIHNpdGVzKToKCmBgYHtyfQpyX3Bvcl9zcGV4X3Byb3BhbGwgPC0gbG0ocG9yX3Njb3JlX3N0ZF9jb2xsYXBzZSB+IHNwZXhfc2NvcmVfcHJvcGFsbF9zdGRfY29sbGFwc2UgKiBlcGlfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRfcG9yX3NwZXhfYmFzZV9xMnRvMjNfcHJvcGFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZXBpX2N0cnkgPSBjb250cmFzdHNfY3RyeV9jdHIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0Kc3VtbWFyeShyX3Bvcl9zcGV4X3Byb3BhbGwpJGNvZWZmaWNpZW50cyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBgc3RhbmRhcmQgZXJyb3JgID0gU3RkLi5FcnJvciwgYHRgID0gdC52YWx1ZSwKICAgICAgICAgcCA9IFByLi4udC4uKSAlPiUKICBtdXRhdGVfYXQodmFycygtcGFyYW1ldGVyLCAtcCksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAga2FibGUoYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgNSksICJsIiksCiAgICAgICAgY2FwdGlvbiA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3Jvc2l0eSBhbmQgc3Bpcml0dWFsIGV4cGVyaWVuY2UsIGNvbXBhcmluZyBhY3Jvc3Mgc2l0ZXMgW21vZGVsOiBsbShwb3Jfc2NvcmVfc3RkX2NvbGxhcHNlIH4gc3BleF9zY29yZV9wcm9wYWxsX3N0ZF9jb2xsYXBzZSAqIGVwaV9jdHJ5LCBkX3Bvcl9zcGV4X2Jhc2VfcTJ0bzIzX3Byb3BhbGwpXSIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDIsIDc6MTApLCBib2xkID0gVCkKYGBgCgpJbmNsdWRpbmcgYWxsIG9mIHRoZSBkYXRhIGluIGEgc2luZ2xlIGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQsIGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gUG9yb3NpdHkgYW5kIFNwaXJpdHVhbCBFeHBlcmllbmNlIHNjb3JlcyBpcyBzaWduaWZpY2FudGx5IHBvc2l0aXZlIChzZWUgInNwZXhfc2NvcmVfcHJvcGFsbF9zdGQiIHJvdyBpbiB0aGUgdGFibGUgYWJvdmUpLiBIb3dldmVyLCB0aGlzIHJlbGF0aW9uc2hpcCBhcHBlYXJzIHRvIGJlIHNpZ25pZmljYW50bHkgd2Vha2VyIGFtb25nIHBhcnRpY2lwYW50cyBvdXRzaWRlIG9mIHRoZSBVUyB0aGFuIGl0IGlzIGFtb25nIFVTIHBhcnRpY2lwYW50cyAoc2VlICJzcGV4X3Njb3JlX3Byb3BhbGxfc3RkOmVwaV9jdHJ5bm9uVVNfVVMiIHJvdyksIHNpZ25pZmljYW50bHkgd2Vha2VyIGFtb25nIHBhcnRpY2lwYW50cyBpbiBHaGFuYSBhbmQgVmFudWF0dSByZWxhdGl2ZSB0byBwYXJ0aWNpcGFudHMgaW4gVGhhaWxhbmQgYW5kIENoaW5hIChzZWUgInNwZXhfc2NvcmVfcHJvcGFsbF9zdGQ6ZXBpX2N0cnlHSFZUX1RIQ0giIHJvdyksIGFuZCBzaWduaWZpY2FudGx5IHdlYWtlciBhbW9uZyBwYXJ0aWNpcGFudHMgaW4gR2hhbmEgcmVsYXRpdmUgdG8gcGFydGljaXBhbnRzIGluIFZhbnVhdHUgKHNlZSAic3BleF9zY29yZV9wcm9wYWxsX3N0ZDplcGlfY3RyeUdIX1ZUIiByb3cpLiBJbiBvdGhlciB3b3JkcywgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvcm9zaXR5IGFuZCBTcGlyaXR1YWwgRXhwZXJpZW5jZSBzZWVtcyB0byBoYXZlIGJlZW4gc3Ryb25nZXN0IGluIHRoZSBVUyBhbmQgQ2hpbmVzZSBzYW1wbGVzLCB3ZWFrZXIgaW4gdGhlIG5pLVZhbiBhbmQgVGhhaSBzYW1wbGVzLCBhbmQgd2Vha2VzdCBpbiB0aGUgR2hhbmFpYW4gc2FtcGxlLiAoVGhpcyBpcyB0cnVlIGV2ZW4gYWZ0ZXIgYWNjb3VudGluZyBmb3Igb3ZlcmFsbCBkaWZmZXJlbmNlcyBpbiBwb3Jvc2l0eSBhbmQgc3Bpcml0dWFsIGV4cGVyaWVuY2UgYWNyb3NzIHNpdGVzLikKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjMsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsLAogICAgICAgYWVzKHggPSBwb3Jfc2NvcmVfc3RkLCB5ID0gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gZXBpX2N0cnksIG5jb2wgPSA1LCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogICMgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNiwgNCkpICsKICAjIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjIsIDQpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcm9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJJbmNsdWRlcyBhbGwgYmVpbmdzIGZvciBUaGFpbGFuZCIsCiAgICAgICB4ID0gIlBvcm9zaXR5IHNjb3JlIChzdGFuZGFyZGl6ZWQgd2l0aGluIGVhY2ggc2l0ZSkiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgZXhwLiBwcm9wb3J0aW9uIHNjb3JlXG4oc3RhbmRhcmRpemVkIHdpdGhpbiBlYWNoIHNpdGUpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuMzUsIGluY2x1ZGUgPSBGfQpnZ3Bsb3QoZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsICU+JQogICAgICAgICBmaWx0ZXIoYWJzKHBvcl9zY29yZV9zdGQpIDwgMiwKICAgICAgICAgICAgICAgIGFicyhzcGV4X3Njb3JlX3Byb3BhbGxfc3RkKSA8IDIpLAogICAgICAgYWVzKHggPSBwb3Jfc2NvcmVfc3RkLCB5ID0gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gZXBpX2N0cnksIG5jb2wgPSA1KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBzaG93LmxlZ2VuZCA9IEYpICsKICAjIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTYsIDQpKSArCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyLCA0KSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gcG9yb3NpdHkgYW5kIHNwaXJpdHVhbCBleHBlcmllbmNlIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGFsbCBiZWluZ3MgZm9yIFRoYWlsYW5kXG5FeGNsdWRpbmcgb3V0bGllcnMgKHogPiAyIG9yIHogPCAtMikiLAogICAgICAgeCA9ICJQb3Jvc2l0eSBzY29yZSAoc3RhbmRhcmRpemVkIHdpdGhpbiBlYWNoIHNpdGUpIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIGV4cC4gcHJvcG9ydGlvbiBzY29yZVxuKHN0YW5kYXJkaXplZCB3aXRoaW4gZWFjaCBzaXRlKSIpCmBgYAoKTmV4dCwgSSdsbCBsb29rIGF0IHRoaXMgcmVsYXRpb25zaGlwIGNvbnNpZGVyaW5nIGVhY2ggc2l0ZXMgaW5kaXZpZHVhbGx5IGluIGl0cyBvd24gYW5hbHlzaXMgKHN0YW5kYXJkaXppbmcgc2NvcmVzIHdpdGhpbiBlYWNoIHNpdGUpOgoKYGBge3J9CnJfcG9yX3NwZXhfcHJvcGFsbF91cyA8LSBsbShwb3Jfc2NvcmVfc3RkIH4gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiVVMiKSkKCnJfcG9yX3NwZXhfcHJvcGFsbF9naCA8LSBsbShwb3Jfc2NvcmVfc3RkIH4gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiR2hhbmEiKSkKCnJfcG9yX3NwZXhfcHJvcGFsbF90aCA8LSBsbShwb3Jfc2NvcmVfc3RkIH4gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiVGhhaWxhbmQiKSkKCnJfcG9yX3NwZXhfcHJvcGFsbF9jaCA8LSBsbShwb3Jfc2NvcmVfc3RkIH4gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiQ2hpbmEiKSkKCnJfcG9yX3NwZXhfcHJvcGFsbF92dCA8LSBsbShwb3Jfc2NvcmVfc3RkIH4gc3BleF9zY29yZV9wcm9wYWxsX3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19wcm9wYWxsICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihlcGlfY3RyeSA9PSAiVmFudWF0dSIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KcmJpbmQoc3VtbWFyeShyX3Bvcl9zcGV4X3Byb3BhbGxfdXMpJGNvZWZmaWNpZW50cyAlPiUKICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICAgICAgICBtdXRhdGUoc2l0ZSA9ICJVUyIpLAogICAgICBzdW1tYXJ5KHJfcG9yX3NwZXhfcHJvcGFsbF9naCkkY29lZmZpY2llbnRzICU+JQogICAgICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgICAgICByb3duYW1lc190b19jb2x1bW4oInBhcmFtZXRlciIpICU+JQogICAgICAgIG11dGF0ZShzaXRlID0gIkdoYW5hIiksCiAgICAgIHN1bW1hcnkocl9wb3Jfc3BleF9wcm9wYWxsX3RoKSRjb2VmZmljaWVudHMgJT4lCiAgICAgICAgZGF0YS5mcmFtZSgpICU+JQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigicGFyYW1ldGVyIikgJT4lCiAgICAgICAgbXV0YXRlKHNpdGUgPSAiVGhhaWxhbmQiKSwKICAgICAgc3VtbWFyeShyX3Bvcl9zcGV4X3Byb3BhbGxfY2gpJGNvZWZmaWNpZW50cyAlPiUKICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICAgICAgICBtdXRhdGUoc2l0ZSA9ICJDaGluYSIpLAogICAgICBzdW1tYXJ5KHJfcG9yX3NwZXhfcHJvcGFsbF92dCkkY29lZmZpY2llbnRzICU+JQogICAgICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgICAgICByb3duYW1lc190b19jb2x1bW4oInBhcmFtZXRlciIpICU+JQogICAgICAgIG11dGF0ZShzaXRlID0gIlZhbnVhdHUiKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgYHN0YW5kYXJkIGVycm9yYCA9IFN0ZC4uRXJyb3IsIGB0YCA9IHQudmFsdWUsCiAgICAgICAgIHAgPSBQci4uLnQuLikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLWMocGFyYW1ldGVyLCBwLCBzaXRlKSksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAgc2VsZWN0KC1zaXRlKSAlPiUKICBrYWJsZShhbGlnbiA9IGMoImwiLCByZXAoInIiLCA1KSwgImwiKSwKICAgICAgICBjYXB0aW9uID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcm9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSwgd2l0aGluIGVhY2ggc2l0ZSBzZXBhcmF0ZWx5IFttb2RlbDogbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfcHJvcGFsbF9zdGQsIGRfcG9yX3NwZXhfYmFzZV9xMnRvMjNfcHJvcGFsbCAlPiUgZmlsdGVyKGVwaV9jdHJ5ID09IC4uLildIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIlVTIiwgMSwgMikgJT4lCiAgZ3JvdXBfcm93cygiR2hhbmEiLCAzLCA0KSAlPiUKICBncm91cF9yb3dzKCJUaGFpbGFuZCIsIDUsIDYpICU+JQogIGdyb3VwX3Jvd3MoIkNoaW5hIiwgNywgOCkgJT4lCiAgZ3JvdXBfcm93cygiVmFudWF0dSIsIDksIDEwKSAlPiUKICByb3dfc3BlYyhjKHNlcSgyLCAxMCwgMikpLCBib2xkID0gVCkKYGBgCgpUaGlzIGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvcm9zaXR5IGFuZCBTcGlyaXR1YWwgRXhwZXJpZW5jZSBpcyBzaWduZmljYW50bHkgcG9zaXRpdmUgaW4gYWxsIGZpdmUgc2l0ZXMgY29uc2lkZXJlZCBpbmRpdmlkdWFsbHkuIFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyAoImIiIGNvbHVtbiBpbiB0aGUgdGFibGUgYWJvdmUpIGZ1cnRoZXIgY29uZmlybSB0aGF0IHRoZSBzdHJlbmd0aCBvZiB0aGlzIHJlbGF0aW9uaGlwIHZhcmllZCBhY3Jvc3Mgc2l0ZXM6IEl0IHdhcyBzdHJvbmdlc3QgaW4gQ2hpbmEgYW5kIHRoZSBVUywgbWlkZGxpbmcgaW4gVmFudWF0dSBhbmQgVGhhaWxhbmQsIGFuZCB3ZWFrZXN0IChidXQgc3RpbGwgc2lnbmlmaWNhbnRseSBwb3NpdGl2ZSkgaW4gR2hhbmEuCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENvbnNpZGVyaW5nIGZpcnN0IGZpdmUgImJlaW5ncyIgZm9yIGFsbCBzaXRlcwoKYGBge3J9CmRfcG9yX3NwZXhfYmFzZV9xMnRvMjNfZmlyc3Q1IDwtIGRfc3BleF9iYXNlX3EydG8yM19zY29yZWRfZmlyc3Q1ICU+JSAKICByZW5hbWUoc3BleF9zY29yZV9maXJzdDUgPSBzY29yZSkgJT4lCiAgZnVsbF9qb2luKGRfcG9yX3Njb3JlZCAlPiUgcmVuYW1lKHBvcl9zY29yZSA9IHNjb3JlKSkgJT4lCiAgZ3JvdXBfYnkoZXBpX2N0cnkpICU+JQogIG11dGF0ZShwb3Jfc2NvcmVfc3RkID0gc2NhbGUocG9yX3Njb3JlKSwKICAgICAgICAgc3BleF9zY29yZV9maXJzdDVfc3RkID0gc2NhbGUoc3BleF9zY29yZV9maXJzdDUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHBvcl9zY29yZV9zdGRfY29sbGFwc2UgPSBzY2FsZShwb3Jfc2NvcmUpLAogICAgICAgICBzcGV4X3Njb3JlX2ZpcnN0NV9zdGRfY29sbGFwc2UgPSBzY2FsZShzcGV4X3Njb3JlX2ZpcnN0NSkpCgojIGVmZmVjdC1jb2RlIGJ5IGRlZmF1bHQKY29udHJhc3RzKGRfcG9yX3NwZXhfYmFzZV9xMnRvMjNfZmlyc3Q1JGVwaV9jdHJ5KSA8LSBjb250ci5zdW0oNSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuMzUsIGluY2x1ZGUgPSBGfQpnZ3Bsb3QoZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUsCiAgICAgICBhZXMoeCA9IHBvcl9zY29yZSwgeSA9IHNwZXhfc2NvcmVfZmlyc3Q1LCBjb2xvciA9IGVwaV9jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiBlcGlfY3RyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNiwgNCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyLCAyKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gcG9yb3NpdHkgYW5kIHNwaXJpdHVhbCBleHBlcmllbmNlIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGZpcnN0IGZpdmUgYmVpbmdzIGZvciBhbGwgc2l0ZXMiLAogICAgICAgeCA9ICJQb3Jvc2l0eSBzY29yZSAoMC0xNikiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgZXhwLiBzdW0gc2NvcmUgKDAtMjIpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuMywgaW5jbHVkZSA9IFR9CmdncGxvdChkX3Bvcl9zcGV4X2Jhc2VfcTJ0bzIzX2ZpcnN0NSwKICAgICAgIGFlcyh4ID0gcG9yX3Njb3JlX3N0ZF9jb2xsYXBzZSwgeSA9IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZF9jb2xsYXBzZSwgCiAgICAgICAgICAgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gZXBpX2N0cnksIG5jb2wgPSA1LCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoLTQsIDQsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtNCwgNCwgMSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAgIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gcG9yb3NpdHkgYW5kIHNwaXJpdHVhbCBleHBlcmllbmNlIiwKICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIGZpcnN0IGZpdmUgYmVpbmdzIGZvciBhbGwgc2l0ZXMiLAogICAgICAgeCA9ICJQb3Jvc2l0eSBzY29yZSAoc3RhbmRhcmRpemVkIGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzKSIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBleHAuIHN1bSBzY29yZVxuKHN0ZC4gY29sbGFwc2luZyBhY3Jvc3Mgc2l0ZXMpIikKYGBgCgpBZ2FpbiwgaXQgaXMgY2xlYXIgZnJvbSB0aGUgcGxvdCB0aGF0IHRoZXJlIGlzIGEgZ2VuZXJhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3Jvc2l0eSBhbmQgU3Bpcml0dWFsIEV4cGVyaWVuY2Ugc2NvcmVzLCBhbmQgdGhlIHN0cmVuZ3RoIG9mIHRoaXMgcmVsYXRpb25zaGlwcyBhcHBlYXJzIHRvIHZhcnkgc29tZXdoYXQgYWNyb3NzIHNpdGVzLiAKCkZpcnN0LCBJJ2xsIGxvb2sgYXQgdGhpcyByZWxhdGlvbnNoaXAgY29uc2lkZXJpbmcgYWxsIHNpdGVzIGluIHRoZSBzYW1lIGFuYWx5c2lzIChzdGFuZGFyZGl6aW5nIHNjb3JlcyBjb2xsYXBzaW5nIGFjcm9zcyBhbGwgc2l0ZXMsIHRvIG1haW50YWluIHRoZSBwYXR0ZXJuIGZvIGdlbmVyYWwgZGlmZmVyZW5jZXMgaW4gUG9yb3NpdHkgYW5kIFNwaXJpdHVhbCBFeHBlcmllbmNlIGFjcm9zcyBzaXRlcyk6CgpgYGB7cn0Kcl9wb3Jfc3BleF9maXJzdDUgPC0gbG0ocG9yX3Njb3JlX3N0ZF9jb2xsYXBzZSB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZF9jb2xsYXBzZSAqIGVwaV9jdHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGVwaV9jdHJ5ID0gY29udHJhc3RzX2N0cnlfY3RyKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnN1bW1hcnkocl9wb3Jfc3BleF9maXJzdDUpJGNvZWZmaWNpZW50cyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICByZW5hbWUoYiA9IEVzdGltYXRlLCBgc3RhbmRhcmQgZXJyb3JgID0gU3RkLi5FcnJvciwgYHRgID0gdC52YWx1ZSwKICAgICAgICAgcCA9IFByLi4udC4uKSAlPiUKICBtdXRhdGVfYXQodmFycygtcGFyYW1ldGVyLCAtcCksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAga2FibGUoYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgNSksICJsIiksCiAgICAgICAgY2FwdGlvbiA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3Jvc2l0eSBhbmQgc3Bpcml0dWFsIGV4cGVyaWVuY2UsIGNvbXBhcmluZyBhY3Jvc3Mgc2l0ZXMgW21vZGVsOiBsbShwb3Jfc2NvcmVfc3RkX2NvbGxhcHNlIH4gc3BleF9zY29yZV9maXJzdDVfc3RkX2NvbGxhcHNlICogZXBpX2N0cnksIGRfcG9yX3NwZXhfYmFzZV9xMnRvMjNfZmlyc3Q1KV0iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygyLCA3OjEwKSwgYm9sZCA9IFQpCmBgYAoKVGhpcyBhbmFseXNpcyBpcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIHRvIHRoZSBwYXJhbGxlbCBhbmFseXNpcyB1c2luZyBwcm9wb3J0aW9uIHNjb3JlcywgYWJvdmXigJR3aXRoIHRoZSBhZGRpdGlvbmFsIHN1Z2dlc3Rpb24gdGhhdCB0aGUgcmVsYXRpb25zaGlwIHdhcyBzaWduaWZpY2FudGx5IHdlYWtlciBhbW9uZyBwYXJ0aWNpcGFudHMgaW4gVGhhaWxhbmQgdGhhbiBwYXJ0aWNpcGFudHMgaW4gQ2hpbmEgKHNlZSAic3BleF9zY29yZV9maXJzdDVfc3RkOmVwaV9jdHJ5VEhfQ0giIHJvdyBpbiB0YWJsZSBhYm92ZSkuCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuMywgaW5jbHVkZSA9IFR9CmdncGxvdChkX3Bvcl9zcGV4X2Jhc2VfcTJ0bzIzX2ZpcnN0NSwKICAgICAgIGFlcyh4ID0gcG9yX3Njb3JlX3N0ZCwgeSA9IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwgY29sb3IgPSBlcGlfY3RyeSkpICsKICBmYWNldF93cmFwKH4gZXBpX2N0cnksIG5jb2wgPSA1LCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIsIHNob3cubGVnZW5kID0gRikgKwogICMgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNiwgNCkpICsKICAjIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjIsIDQpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcm9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJJbmNsdWRlcyBmaXJzdCBmaXZlIGJlaW5ncyBmb3IgYWxsIHNpdGVzIiwKICAgICAgIHggPSAiUG9yb3NpdHkgc2NvcmUgKHN0YW5kYXJkaXplZCB3aXRoaW4gZWFjaCBzaXRlKSIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBleHAuIHN1bSBzY29yZVxuKHN0YW5kYXJkaXplZCB3aXRoaW4gZWFjaCBzaXRlKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjM1LCBpbmNsdWRlID0gRn0KZ2dwbG90KGRfcG9yX3NwZXhfYmFzZV9xMnRvMjNfZmlyc3Q1ICU+JQogICAgICAgICBmaWx0ZXIoYWJzKHBvcl9zY29yZV9zdGQpIDwgMiwKICAgICAgICAgICAgICAgIGFicyhzcGV4X3Njb3JlX2ZpcnN0NV9zdGQpIDwgMiksCiAgICAgICBhZXMoeCA9IHBvcl9zY29yZV9zdGQsIHkgPSBzcGV4X3Njb3JlX2ZpcnN0NV9zdGQsIGNvbG9yID0gZXBpX2N0cnkpKSArCiAgZmFjZXRfd3JhcCh+IGVwaV9jdHJ5LCBuY29sID0gNSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgIyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE2LCA0KSkgKwogICMgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMiwgNCkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcm9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJJbmNsdWRlcyBmaXJzdCBmaXZlIGJlaW5ncyBmb3IgYWxsIHNpdGVzXG5FeGNsdWRpbmcgb3V0bGllcnMgKHogPiAyIG9yIHogPCAtMikiLAogICAgICAgeCA9ICJQb3Jvc2l0eSBzY29yZSAoc3RhbmRhcmRpemVkIHdpdGhpbiBlYWNoIHNpdGUpIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIGV4cC4gc3VtIHNjb3JlXG4oc3RhbmRhcmRpemVkIHdpdGhpbiBlYWNoIHNpdGUpIikKYGBgCgpOZXh0LCBJJ2xsIGxvb2sgYXQgdGhpcyByZWxhdGlvbnNoaXAgY29uc2lkZXJpbmcgZWFjaCBzaXRlcyBpbmRpdmlkdWFsbHkgaW4gaXRzIG93biBhbmFseXNpcyAoc3RhbmRhcmRpemluZyBzY29yZXMgd2l0aGluIGVhY2ggc2l0ZSk6CgpgYGB7cn0Kcl9wb3Jfc3BleF9maXJzdDVfdXMgPC0gbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJVUyIpKQoKcl9wb3Jfc3BleF9maXJzdDVfZ2ggPC0gbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJHaGFuYSIpKQoKcl9wb3Jfc3BleF9maXJzdDVfdGggPC0gbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJUaGFpbGFuZCIpKQoKcl9wb3Jfc3BleF9maXJzdDVfY2ggPC0gbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJDaGluYSIpKQoKcl9wb3Jfc3BleF9maXJzdDVfdnQgPC0gbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGVwaV9jdHJ5ID09ICJWYW51YXR1IikpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpyYmluZChzdW1tYXJ5KHJfcG9yX3NwZXhfZmlyc3Q1X3VzKSRjb2VmZmljaWVudHMgJT4lCiAgICAgICAgZGF0YS5mcmFtZSgpICU+JQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigicGFyYW1ldGVyIikgJT4lCiAgICAgICAgbXV0YXRlKHNpdGUgPSAiVVMiKSwKICAgICAgc3VtbWFyeShyX3Bvcl9zcGV4X2ZpcnN0NV9naCkkY29lZmZpY2llbnRzICU+JQogICAgICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgICAgICByb3duYW1lc190b19jb2x1bW4oInBhcmFtZXRlciIpICU+JQogICAgICAgIG11dGF0ZShzaXRlID0gIkdoYW5hIiksCiAgICAgIHN1bW1hcnkocl9wb3Jfc3BleF9maXJzdDVfdGgpJGNvZWZmaWNpZW50cyAlPiUKICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJwYXJhbWV0ZXIiKSAlPiUKICAgICAgICBtdXRhdGUoc2l0ZSA9ICJUaGFpbGFuZCIpLAogICAgICBzdW1tYXJ5KHJfcG9yX3NwZXhfZmlyc3Q1X2NoKSRjb2VmZmljaWVudHMgJT4lCiAgICAgICAgZGF0YS5mcmFtZSgpICU+JQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigicGFyYW1ldGVyIikgJT4lCiAgICAgICAgbXV0YXRlKHNpdGUgPSAiQ2hpbmEiKSwKICAgICAgc3VtbWFyeShyX3Bvcl9zcGV4X2ZpcnN0NV92dCkkY29lZmZpY2llbnRzICU+JQogICAgICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgICAgICByb3duYW1lc190b19jb2x1bW4oInBhcmFtZXRlciIpICU+JQogICAgICAgIG11dGF0ZShzaXRlID0gIlZhbnVhdHUiKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgYHN0YW5kYXJkIGVycm9yYCA9IFN0ZC4uRXJyb3IsIGB0YCA9IHQudmFsdWUsCiAgICAgICAgIHAgPSBQci4uLnQuLikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLWMocGFyYW1ldGVyLCBwLCBzaXRlKSksIGZ1bnMocm91bmQoLiwgMikpKSAlPiUKICBtdXRhdGUocCA9IGlmZWxzZShwIDwgMC4wMDEsICI8MC4wMDEiLCByb3VuZChwLCAzKSksCiAgICAgICAgIHNpZ25pZmljYW50ID0gaWZlbHNlKHAgPCAwLjA1LCAiKiIsICIiKSkgJT4lCiAgc2VsZWN0KC1zaXRlKSAlPiUKICBrYWJsZShhbGlnbiA9IGMoImwiLCByZXAoInIiLCA1KSwgImwiKSwKICAgICAgICBjYXB0aW9uID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvcm9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSwgd2l0aGluIGVhY2ggc2l0ZSBzZXBhcmF0ZWx5IFttb2RlbDogbG0ocG9yX3Njb3JlX3N0ZCB+IHNwZXhfc2NvcmVfZmlyc3Q1X3N0ZCwgZF9wb3Jfc3BleF9iYXNlX3EydG8yM19maXJzdDUgJT4lIGZpbHRlcihlcGlfY3RyeSA9PSAuLi4pXSIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJVUyIsIDEsIDIpICU+JQogIGdyb3VwX3Jvd3MoIkdoYW5hIiwgMywgNCkgJT4lCiAgZ3JvdXBfcm93cygiVGhhaWxhbmQiLCA1LCA2KSAlPiUKICBncm91cF9yb3dzKCJDaGluYSIsIDcsIDgpICU+JQogIGdyb3VwX3Jvd3MoIlZhbnVhdHUiLCA5LCAxMCkgJT4lCiAgcm93X3NwZWMoYyhzZXEoMiwgMTAsIDIpKSwgYm9sZCA9IFQpCmBgYAoKQXMgd2l0aCB0aGUgYW5hbHlzaXMgb2YgcHJvcG9ydGlvbiBzY29yZXMsIHRoaXMgYW5hbHlzaXMgc3VnZ2VzdHMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gUG9yb3NpdHkgYW5kIFNwaXJpdHVhbCBFeHBlcmllbmNlIGlzIHNpZ25maWNhbnRseSBwb3NpdGl2ZSBpbiBhbGwgZml2ZSBzaXRlcyBjb25zaWRlcmVkIGluZGl2aWR1YWxseSwgYW5kIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyAoImIiIGNvbHVtbiBpbiB0aGUgdGFibGUgYWJvdmUpIGZ1cnRoZXIgY29uZmlybSB0aGF0IHRoaXMgcmVsYXRpb25oaXAgd2FzIHN0cm9uZ2VzdCBpbiBDaGluYSBhbmQgdGhlIFVTLCBtaWRkbGluZyBpbiBWYW51YXR1IGFuZCBUaGFpbGFuZCwgYW5kIHdlYWtlc3QgKGJ1dCBzdGlsbCBzaWduaWZpY2FudGx5IHBvc2l0aXZlKSBpbiBHaGFuYS4KCgo=